[mysql] 전체 텍스트 검색 엔진 비교-Lucene, Sphinx, Postgresql, MySQL?

Django 사이트를 구축 중이며 검색 엔진을 찾고 있습니다.

몇 후보 :

  • 나침반 / 솔러가있는 루신 / 루신

  • 스핑크스

  • PostgreSQL 내장 전체 텍스트 검색

  • MySQl 내장 전체 텍스트 검색

선택 기준 :

  • 결과 관련성 및 순위
  • 검색 및 색인 생성 속도
  • Django와의 사용 편의성 및 통합 용이성
  • 리소스 요구 사항-사이트가 VPS 에서 호스팅 되므로 검색 엔진에 많은 RAM과 CPU가 필요하지 않습니다.
  • 확장 성
  • “당신은 의미 했습니까?”, 관련 검색 등과 같은 추가 기능

위의 검색 엔진 또는 목록에없는 다른 엔진에 대해 경험이있는 사람은 여러분의 의견을 듣고 싶습니다.

편집 : 인덱싱 요구 사항에 대해 사용자가 사이트에 데이터를 계속 입력하면 해당 데이터를 지속적으로 인덱싱해야합니다. 실시간 일 필요는 없지만 15 ~ 30 분 이상 지연되지 않고 새로운 데이터가 인덱스에 표시되는 것이 이상적입니다.



답변

누군가가 Lucene에 대해 잘 알고있는 것은 반가운 일이다. 왜냐하면 나는 그것에 대해 전혀 모른다.

반면에 스핑크스는 꽤 잘 알고 있으므로 도움이 될 수 있는지 봅시다.

  • 결과 관련성 순위가 기본값입니다. 원하는 경우 고유 한 정렬을 설정하고 특정 필드에 더 높은 가중치를 부여 할 수 있습니다.
  • 인덱싱 속도는 데이터베이스와 직접 통신하기 때문에 초고속입니다. 복잡한 SQL 쿼리와 인덱싱되지 않은 외래 키 및 기타 문제로 인해 속도가 느려질 수 있습니다. 검색 속도가 느려진 적이 없습니다.
  • 저는 Rails 사용자이므로 Django로 구현하는 것이 얼마나 쉬운 지 모르겠습니다. Sphinx 소스와 함께 제공되는 Python API가 있습니다.
  • 검색 서비스 데몬 (검색)은 메모리 사용량이 매우 적으며 인덱서 프로세스가 사용 하는 메모리 양에 제한을 설정할 수 있습니다.
  • 확장 성은 내 지식이 더 스케치되는 곳이지만 인덱스 파일을 여러 시스템에 복사하고 여러 개의 검색된 데몬을 실행하기에 충분합니다. 그러나 다른 사람들로부터 얻는 일반적인 인상은 높은로드에서 꽤 훌륭하다는 것입니다. 따라서 여러 컴퓨터에 걸쳐 확장하는 것은 다루어야 할 것이 아닙니다.
  • 다른 도구를 사용하여 쉽게 수행 할 수는 있지만 ‘평균적인 것’등은 지원하지 않습니다. 스핑크스는 사전을 사용하여 단어를 사용하므로 ‘구동’과 ‘구동'(예 : 검색)은 검색에서 동일하게 간주됩니다.
  • 스핑크스는 필드 데이터에 대한 부분 인덱스 업데이트를 허용하지 않습니다. 이에 대한 일반적인 접근 방식은 최근의 모든 변경 사항이 포함 된 델타 인덱스를 유지 관리하고 매 변경이있을 때마다이를 다시 인덱싱하는 것입니다 (그리고 새로운 결과는 1-2 초 내에 나타납니다). 적은 양의 데이터로 인해 몇 초가 걸릴 수 있습니다. 그래도 주 데이터 세트를 정기적으로 다시 색인화해야합니다 (하지만 데이터의 변동성 (매일? 매시간마다)에 얼마나 정기적으로 의존하는지). 빠른 인덱싱 속도는이 모든 것을 고통스럽게 유지합니다.

나는 이것이 당신의 상황에 어떻게 적용되는지 모르겠지만, Evan Weaver는 몇 가지 일반적인 Rails 검색 옵션 (Sphinx, Ferret (Lucene의 Lucene 포트) 및 Solr)을 비교하여 몇 가지 벤치 마크를 실행했습니다. 도움이 될 것 같습니다.

필자는 MySQL의 전체 텍스트 검색의 깊이를 파악하지는 않았지만 Sphinx, Lucene 또는 Solr과 속도면이나 기능면에서 경쟁하지 않는다는 것을 알고 있습니다.


답변

Sphinx는 모르지만 Lucene과 데이터베이스 전체 텍스트 검색은 Lucene 성능이 필적 할 것이라고 생각합니다. 거의 모든 것을 할 수 있어야 합니다Lucene 색인을 올바르게 설정 한 경우 검색해야하는 레코드 수에 관계없이 10ms 이내에 검색 합니다.

그러나 가장 큰 장애물은 다음과 같습니다. 개인적으로 프로젝트에 Lucene을 통합하는 것은 쉽지 않다고 생각합니다 . 물론 설정하기가 어렵지 않으므로 기본적인 검색을 수행 할 수 있지만 최적의 성능으로 최대한 활용하려면 Lucene에 대한 좋은 책이 필요합니다.

CPU 및 RAM 요구 사항과 관련하여 Lucene에서 검색을 수행해도 CPU 인덱싱이 너무 많지는 않지만 데이터 인덱싱은 너무 자주 수행하지는 않지만 (하루에 1-2 번) 수행되지는 않습니다. 많은 장애물.

모든 질문에 대답하는 것은 아니지만 간단히 말해서 검색 할 데이터가 많고 성능이 뛰어나면 Lucene이 갈 길이라고 생각합니다. 검색 할 데이터가 많지 않으면 데이터베이스 전체 텍스트 검색을 수행 할 수도 있습니다. 필자의 책에서 MySQL 전체 텍스트 검색을 설정하는 것이 훨씬 쉽다.


답변

Solr에 관한 더 많은 정보가 게시되지 않은 것에 놀랐습니다. Solr은 스핑크스와 매우 유사하지만 고급 기능을 가지고 있습니다 (스핑크스를 사용하지 않았기 때문에 AFAIK는 읽지 않았습니다).

아래 링크의 답변은 Solr에도 적용되는 Sphinx에 대한 몇 가지 사항을 자세히 설명합니다.
전체 텍스트 검색 엔진 비교-Lucene, Sphinx, Postgresql, MySQL?

Solr은 다음과 같은 추가 기능도 제공합니다.

  1. 복제 지원
  2. 다중 코어 (자체 구성 및 자체 색인이있는 별도의 데이터베이스로 생각)
  3. 부울 검색
  4. 키워드 강조 (regex-fu가있는 경우 응용 프로그램 코드에서 상당히 쉽게 수행 할 수 있지만 특수 도구를 통해 더 나은 작업을 수행 할 수있는 이유는 무엇입니까?)
  5. XML 또는 구분 파일을 통한 인덱스 업데이트
  6. HTTP를 통해 검색 서버와 통신합니다 (Json, Native PHP / Ruby / Python을 반환 할 수도 있음)
  7. PDF, Word 문서 인덱싱
  8. 동적 필드
  9. 패싯
  10. 집계 필드
  11. 중지 단어, 동의어 등
  12. 더 이것처럼 …
  13. 사용자 정의 쿼리를 사용하여 데이터베이스에서 직접 인덱스
  14. 자동 제안
  15. 캐시 자동 온난화
  16. 빠른 인덱싱 (MySQL 전체 텍스트 검색 인덱싱 시간과 비교)-Lucene은 이진 반전 인덱스 형식을 사용합니다.
  17. 부스팅 (특정 키워드 또는 문구 등의 관련성을 높이기위한 맞춤 규칙)
  18. 필드 검색 (검색 사용자가 검색하려는 필드를 알고있는 경우 필드, 값을 입력하여 검색 범위를 좁히고 모든 것보다는 해당 필드 만 검색 함)

BTW에는 더 많은 기능이 있습니다. 그러나 실제로 프로덕션 환경에서 사용한 기능 만 나열했습니다. BTW는 기본적으로 MySQL이 위 목록에서 # 1, # 3 및 # 11 (제한적)을 지원합니다. 찾고있는 기능의 경우 관계형 데이터베이스는이를 자르지 않습니다. 나는 그것들을 곧바로 제거 할 것입니다.

또한 Solr (실제로 Lucene)은 문서 데이터베이스 (예 : NoSQL)이므로 Solr를 사용하여 다른 문서 데이터베이스의 많은 이점을 실현할 수 있습니다. 다시 말해, 단순히 검색 (예 : 성능) 이상의 용도로 사용할 수 있습니다. 그것으로 창의력을 발휘하십시오 🙂


답변

아파치 솔러


OP의 질문에 답하는 것 외에도 간단한 설치 에서 자세한 설치구현에 이르기까지 Apache Solr에 대한 통찰력을 제공하겠습니다 .

간단한 소개


위의 검색 엔진 또는 목록에없는 다른 엔진에 대해 경험이있는 사람은 여러분의 의견을 듣고 싶습니다.

실시간 문제를 해결하기 위해 Solr을 사용 해서는 안됩니다. 검색 엔진의 경우 Solr 은 거의 게임이며 완벽하게 작동합니다 .

Solr 은 High Traffic 웹 응용 프로그램에서 제대로 작동합니다 (이 사이트에 적합하지 않은 곳을 읽었지만 그 진술을 백업하고 있습니다 ). CPU가 아닌 RAM을 사용합니다.

  • 결과 관련성 및 순위

부스트는 당신이 당신의 결과가 상단에 표시 순위를하는 데 도움이됩니다. 말, 당신은 이름을 검색하려는 필드의에서 FIRSTNAMELASTNAME , 당신은에 관련성을 부여 할 FIRSTNAME의 다음 필요 필드 부스트FIRSTNAME의 그림과 같이 필드.

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

보다시피, firstname 필드는 2 점으로 향상 됩니다.

SolrRelevancy 에 대한 추가 정보

  • 검색 및 색인 생성 속도

속도는 믿을 수 없을 정도로 빠르며 타협하지 않습니다. 내가 Solr 으로 이사 한 이유 .

인덱싱 속도와 관련하여 Solr 은 데이터베이스 테이블에서 JOINS 를 처리 할 수도 있습니다 . 더 높고 복잡한 JOIN 은 인덱싱 속도에 영향을줍니다. 그러나 거대한 RAM 구성으로이 상황을 쉽게 해결할 수 있습니다.

RAM이 높을수록 Solr의 인덱싱 속도가 빠릅니다.

  • Django와의 사용 편의성 및 통합 용이성

SolrDjango 를 통합하려고 시도하지 않았지만 Haystack 을 사용하여이를 달성 할 수 있습니다 . 나는 똑같은 흥미로운 기사 를 발견 했으며 여기에 github 이 있습니다.

  • 리소스 요구 사항-사이트가 VPS에서 호스팅되므로 검색 엔진에 많은 RAM과 CPU가 필요하지 않습니다.

Solr 은 RAM에서 번식하므로 RAM이 높으면 Solr 에 대해 걱정할 필요가 없습니다 .

Solr의 RAM 사용량은 약 10 억 개의 레코드가있는 경우 전체 색인을 생성하여 델타 수입품을 현명하게 활용하여이 상황을 해결할 수 있습니다. 설명했듯이 Solr 은 거의 실시간 솔루션 입니다.

  • 확장 성

Solr 는 확장 성이 뛰어납니다. SolrCloud를 살펴 보십시오 . 그것의 일부 주요 기능.

  • 샤드 (또는 샤딩은 여러 머신에 인덱스를 분배하는 개념입니다. 예를 들어 인덱스가 너무 커지면)
  • 부하 분산 ( Solrj 를 Solr 클라우드와 함께 사용하는 경우 라운드 로빈 메커니즘을 사용하여 부하 분산을 자동으로 처리합니다)
  • 분산 검색
  • 고 가용성
  • “당신은 의미 했습니까?”, 관련 검색 등과 같은 추가 기능

위 시나리오의 경우 Solr 로 압축 된 SpellCheckComponent 를 사용할 수 있습니다 . 많은 다른 기능이있다는 SnowballPorterFilterFactory는 기록을 입력 한 경우, 말을 검색하는 데 도움이 대신에 책이 , 당신은 관련 결과를 나타납니다 .


이 답변은 Apache Solr & MySQL 에 중점을 둡니다 . 장고는 범위를 벗어났습니다.

LINUX 환경에 있다고 가정하면이 기사를 계속 진행할 수 있습니다. (광산은 우분투 14.04 버전이었습니다)

자세한 설치

시작하기

여기 에서 Apache Solr 을 다운로드 하십시오 . 버전은 4.8.1 입니다. 새 버전을 다운로드 할 수 있습니다.

보관 파일을 다운로드 한 후 원하는 폴더로 추출하십시오. .. Downloads또는 무엇이든 말하십시오. Downloads/solr-4.8.1/

프롬프트에서 .. 디렉토리 내부를 탐색하십시오.

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

그래서 지금 당신은 여기에 있습니다 ..

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

Jetty Application Server를 시작하십시오

Jettysolr-4.8.1디렉토리 의 examples 폴더에서 사용할 수 있으므로 해당 폴더를 탐색하여 Jetty Application Server를 시작하십시오.

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

이제 터미널을 닫지 말고 최소화하고 옆에 두십시오.

(팁 : start.jar 다음에 &을 사용하여 Jetty 서버를 백그라운드에서 실행하십시오)

Apache Solr 이 성공적으로 실행 되는지 확인하려면 브라우저에서이 URL을 방문하십시오. http : // localhost : 8983 / solr

사용자 정의 포트에서 부두 실행

기본적으로 포트 8983에서 실행됩니다. 여기 또는 jetty.xml파일 내에서 직접 포트를 변경할 수 있습니다 .

java -Djetty.port=9091 -jar start.jar

JConnector 다운로드

이 JAR 파일은 MySQL 과 JDBC를 연결하는 역할을합니다. 여기 에서 플랫폼 독립적 버전을 다운로드 하십시오.

다운로드 한 후 폴더를 추출하고를 복사 mysql-connector-java-5.1.31-bin.jar하여 lib 디렉토리에 붙여 넣으십시오 .

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

Apache Solr에 링크 할 MySQL 테이블 작성

Solr 을 사용 하려면 검색 할 테이블과 데이터가 있어야합니다. 이를 위해 MySQL 을 사용 하여 테이블을 만들고 임의의 이름을 입력 한 다음 Solr 을 사용하여 MySQL 에 연결하고 해당 테이블과 항목을 색인화 할 수 있습니다 .

1. 테이블 구조

CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );

2. 위의 표를 채우십시오

INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');

코어 내부로 들어가서 lib 지시문 추가

1.로 이동

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2. solrconfig.xml 수정

이 두 지시문을이 파일에 추가하십시오.

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

이제 DIH (데이터 가져 오기 핸들러)를 추가하십시오.

<requestHandler name="/dataimport"
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3. db-data-config.xml 파일을 작성하십시오

파일이 존재하면 무시하고 해당 파일에이 행을 추가하십시오. 첫 번째 줄에서 알 수 있듯이 MySQL 데이터베이스 의 자격 증명을 제공해야 합니다. 데이터베이스 이름, 사용자 이름 및 비밀번호

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(팁 : 엔티티를 여러 개 가질 수 있지만 id 필드를 조심하십시오. 동일한 경우 인덱싱을 건너 뜁니다.)

4. schema.xml 파일 수정

표시된 대로 schema.xml에 추가하십시오 .

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

이행

인덱싱

이것은 실제 거래가있는 곳입니다. Solr Queries를 사용하려면 MySQL 에서 Solr 로 데이터를 인덱싱해야합니다 .

1 단계 : Solr 관리자 패널로 이동

브라우저 에서 URL http : // localhost : 8983 / solr 을 누르십시오 . 화면이 이렇게 열립니다.

이것은 기본 Apache Solr 관리 패널입니다.

마커가 나타내는대로 로깅 순서 로 이동 하여 위 구성 중 하나라도 오류가 있는지 확인하십시오.

2 단계 : 로그 확인

자, 이제 당신은 여기 있습니다. 당신이 할 수 있듯이 많은 노란색 메시지 (경고)가 있습니다. 빨간색으로 표시된 오류 메시지가 없는지 확인하십시오. 이전에는 구성에서 db-data-config.xml 에 선택 쿼리를 추가했습니다. 해당 쿼리에 오류가 있으면 여기에 표시되었을 것입니다.

이것은 Apache Solr 엔진의 로깅 섹션입니다

좋아요, 오류 없습니다. 우리는 잘 지냅니다. 의 선택합시다 collection1 도시 된 바와 같이 목록에서를 선택 Dataimport을

3 단계 : DIH (데이터 가져 오기 핸들러)

다이 하이드로을 사용하여 연결됩니다 MySQL의 에서 SOLR 구성 파일을 통해 DB 데이터-config.xml 파일 로부터 SOLR의 인터페이스에 색인됩니다 데이터베이스에서 10 개 개의 레코드 검색 SOLR을 .

그러려면 full-import를 선택 하고 Clean and Commit 옵션을 선택 하십시오 . 이제 그림과 같이 실행 을 클릭하십시오 .

또는 이와 같이 직접 전체 가져 오기 쿼리를 사용할 수도 있습니다 .

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

데이터 가져 오기 핸들러

당신이 클릭 한 후 실행 , SOLR는 어떤 오류가 있다면, 그것은 말할 것입니다, 인덱스 레코드를 시작 인덱싱 실패 하고 다시 가야 로깅 사라 잘못이 무엇을보고 절을 참조하십시오.

이 구성에 오류가없고 인덱싱이 성공적으로 완료되었다고 가정하면이 알림이 표시됩니다.

인덱싱 성공

4 단계 : Solr 쿼리 실행

모든 것이 잘 된 것처럼 보이 므로 이제 Solr Queries를 사용하여 인덱싱 된 데이터를 쿼리 할 수 있습니다 . 왼쪽 에서 쿼리 를 클릭 한 다음 하단에서 실행 버튼 을 누릅니다 .

그림과 같이 색인화 된 레코드가 표시됩니다.

모든 레코드를 나열하기위한 해당 Solr 쿼리는

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

인덱싱 된 데이터

글쎄, 10 개의 색인화 된 레코드가있다. 예를 들어 Ja로 시작하는 이름 만 필요합니다 .이 경우 열 이름을 타겟팅해야하므로 solr_name쿼리는 다음과 같습니다.

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

Ja *로 시작하는 JSON 데이터

Solr Queries 를 작성하는 방법 입니다. 그것에 대해 더 읽으려면이 아름다운 기사를 확인 하십시오 .


답변

나는 지금 PostgreSQL 전체 텍스트 검색을보고 있으며 현대 검색 엔진의 올바른 기능, 실제로 확장 된 문자 및 다국어 지원, 데이터베이스의 텍스트 필드와의 긴밀한 통합을 갖추고 있습니다.

그러나 + 또는 AND (use & |!)와 같은 사용자 친화적 인 검색 연산자는 없으며 설명서 사이트에서 작동하는 방식에 감격하지 않습니다. 결과 스 니펫에 굵게 일치하는 용어가 있지만 일치 용어가 좋지 않은 기본 알고리즘입니다. 또한 rtf, PDF, MS Office를 색인화하려면 파일 형식 변환기를 찾아 통합해야합니다.

OTOH는 MySQL 텍스트 검색보다 훨씬 낫습니다.이 문자는 세 글자 이하의 단어를 색인화하지도 않습니다. 미디어 위키 검색의 기본 설정이며, 최종 사용자에게는 좋지 않다고 생각합니다 : http://www.searchtools.com/analysis/mediawiki-search/

내가 본 모든 경우에 Lucene / Solr과 Sphinx는 정말 훌륭 합니다. 이 코드는 견고한 코드이며 사용성면에서 크게 개선되었으므로 거의 모든 사람을 만족시키는 검색을위한 도구가 모두 있습니다.

SHAILI의 경우-SOLR에는 Lucene 검색 코드 라이브러리가 포함되어 있으며 훌륭한 독립 실행 형 검색 엔진이 될 구성 요소가 있습니다.


답변

이 아주 오래된 질문에 단지 2 센트. ElasticSearch를 살펴 보는 것이 좋습니다 .

Elasticsearch는 Lucene을 기반으로하는 검색 서버입니다. RESTful 웹 인터페이스와 스키마가없는 JSON 문서가있는 분산 된 다중 테넌트 지원 전체 텍스트 검색 엔진을 제공합니다. Elasticsearch는 Java로 개발되었으며 Apache 라이센스 조건에 따라 공개 소스로 릴리스됩니다.

다른 FTS (전체 텍스트 검색) 엔진에 비해 다음과 같은 장점이 있습니다.

  • RESTful 인터페이스
  • 더 나은 확장 성
  • 대규모 커뮤니티
  • Lucene 개발자가 제작
  • 광범위한 문서
  • 사용 가능한 많은 오픈 소스 라이브러리가 있습니다 (Django 포함)

프로젝트에서이 검색 엔진을 사용하고 있으며 매우 만족합니다.


답변

SearchTools-Avi는 “MySQL 텍스트 검색은 세 글자 이하의 단어는 색인하지 않습니다”라고 말했습니다.

참고로, MySQL 전체 텍스트 최소 단어 길이는 MySQL 5.0 이상 부터 조정할 수 있습니다. 간단한 지침은 Google ‘mysql fulltext min length’입니다.

즉, MySQL 전체 텍스트에는 한계가 있습니다. 하나는 백만 개의 레코드에 도달하면 업데이트 속도가 느려집니다 …