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은 다음과 같은 추가 기능도 제공합니다.
- 복제 지원
- 다중 코어 (자체 구성 및 자체 색인이있는 별도의 데이터베이스로 생각)
- 부울 검색
- 키워드 강조 (regex-fu가있는 경우 응용 프로그램 코드에서 상당히 쉽게 수행 할 수 있지만 특수 도구를 통해 더 나은 작업을 수행 할 수있는 이유는 무엇입니까?)
- XML 또는 구분 파일을 통한 인덱스 업데이트
- HTTP를 통해 검색 서버와 통신합니다 (Json, Native PHP / Ruby / Python을 반환 할 수도 있음)
- PDF, Word 문서 인덱싱
- 동적 필드
- 패싯
- 집계 필드
- 중지 단어, 동의어 등
- 더 이것처럼 …
- 사용자 정의 쿼리를 사용하여 데이터베이스에서 직접 인덱스
- 자동 제안
- 캐시 자동 온난화
- 빠른 인덱싱 (MySQL 전체 텍스트 검색 인덱싱 시간과 비교)-Lucene은 이진 반전 인덱스 형식을 사용합니다.
- 부스팅 (특정 키워드 또는 문구 등의 관련성을 높이기위한 맞춤 규칙)
- 필드 검색 (검색 사용자가 검색하려는 필드를 알고있는 경우 필드, 값을 입력하여 검색 범위를 좁히고 모든 것보다는 해당 필드 만 검색 함)
BTW에는 더 많은 기능이 있습니다. 그러나 실제로 프로덕션 환경에서 사용한 기능 만 나열했습니다. BTW는 기본적으로 MySQL이 위 목록에서 # 1, # 3 및 # 11 (제한적)을 지원합니다. 찾고있는 기능의 경우 관계형 데이터베이스는이를 자르지 않습니다. 나는 그것들을 곧바로 제거 할 것입니다.
또한 Solr (실제로 Lucene)은 문서 데이터베이스 (예 : NoSQL)이므로 Solr를 사용하여 다른 문서 데이터베이스의 많은 이점을 실현할 수 있습니다. 다시 말해, 단순히 검색 (예 : 성능) 이상의 용도로 사용할 수 있습니다. 그것으로 창의력을 발휘하십시오 🙂
답변
아파치 솔러
OP의 질문에 답하는 것 외에도 간단한 설치 에서 자세한 설치 및 구현에 이르기까지 Apache Solr에 대한 통찰력을 제공하겠습니다 .
간단한 소개
위의 검색 엔진 또는 목록에없는 다른 엔진에 대해 경험이있는 사람은 여러분의 의견을 듣고 싶습니다.
실시간 문제를 해결하기 위해 Solr을 사용 해서는 안됩니다. 검색 엔진의 경우 Solr 은 거의 게임이며 완벽하게 작동합니다 .
Solr 은 High Traffic 웹 응용 프로그램에서 제대로 작동합니다 (이 사이트에 적합하지 않은 곳을 읽었지만 그 진술을 백업하고 있습니다 ). CPU가 아닌 RAM을 사용합니다.
- 결과 관련성 및 순위
부스트는 당신이 당신의 결과가 상단에 표시 순위를하는 데 도움이됩니다. 말, 당신은 이름을 검색하려는 존 필드의에서 FIRSTNAME 및 LASTNAME , 당신은에 관련성을 부여 할 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와의 사용 편의성 및 통합 용이성
Solr 과 Django 를 통합하려고 시도하지 않았지만 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를 시작하십시오
Jetty 는 solr-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 을 누르십시오 . 화면이 이렇게 열립니다.
마커가 나타내는대로 로깅 순서 로 이동 하여 위 구성 중 하나라도 오류가 있는지 확인하십시오.
2 단계 : 로그 확인
자, 이제 당신은 여기 있습니다. 당신이 할 수 있듯이 많은 노란색 메시지 (경고)가 있습니다. 빨간색으로 표시된 오류 메시지가 없는지 확인하십시오. 이전에는 구성에서 db-data-config.xml 에 선택 쿼리를 추가했습니다. 해당 쿼리에 오류가 있으면 여기에 표시되었을 것입니다.
좋아요, 오류 없습니다. 우리는 잘 지냅니다. 의 선택합시다 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
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 전체 텍스트에는 한계가 있습니다. 하나는 백만 개의 레코드에 도달하면 업데이트 속도가 느려집니다 …