2012-05-16 3 views
7

google suggestions과 같은 텍스트 검색을하고 싶습니다.은 postgresql trigrams 및 전체 텍스트 검색으로 google을 추천합니다.

마법의 Postgis 때문에 PostgreSQL을 사용하고 있습니다.

내가 FTS 사용에 대한 생각,하지만 난 그게 partial words를 검색 할 수없는 것을보고는, 그래서 this question을 발견하는 방법과 trigrams 작품을 보았다.

주요 문제는 내가 연구하고있는 검색 엔진이 스페인어입니다. FTS는 형태소 분석 및 dictionaries (동의어, 맞춤법 오류), UTF 등으로 효과적이었습니다. Trigrams는 부분적인 단어에 잘 작동했지만 ASCII 용으로 만 작동하며 (분명히) 사전과 같은 것을 사용하지 않습니다.

둘 다 최고의 물건을 사용할 수있는 방법이 있다면 나는 생각했다.

전체 텍스트 검색과 Trigrams를 PGSQL에서 함께 사용할 수 있습니까?

답변

3

이 작업은 Postgres에서 수행 할 수 있으며 Lucene은 필요하지 않습니다.

아래와 같이 tsquery 또는 tsvector의 문구를 인용 할 수 있습니다. 당신은 접두사 검색을 할 수있는 tsquery 용어 후 :*을 추가 할 수 있습니다

select 
'''new york city'''::tsvector @@ '''new yo'':*'::tsquery, --true 
'''new york times'''::tsvector @@ '''new yo'':*'::tsquery, --true 
'''new york'''::tsvector  @@ '''new yo'':*'::tsquery, --true 
'''new'''::tsvector    @@ '''new yo'':*'::tsquery, --false 
'new'::tsvector     @@ '''new yo'':*'::tsquery, --false 
'new york'::tsvector   @@ '''new yo'':*'::tsquery --false 

가장 큰 문제는 to_tsvector()[plain]to_tsquery() 당신의 따옴표를 제거하는 것입니다. 이 작업을 수행하지 않는 자신 만의 버전을 작성할 수 있습니다 (그다지 어렵지 않습니다). 또는 용어 후반에 n 그램을 작성하기 위해 몇 가지 사후 처리를 수행하십시오.

위의 여분의 작은 따옴표는 그냥 이스케이프입니다. select $$ i heart 'new york city' $$::tsvector;은 동일합니다.

+0

와우! 이 트리플 쿼터에 관한 문서를 참고하시기 바랍니다. – jperelli

+1

삼중 따옴표는 실제로는 일반 SQL입니다. 단 하나의 따옴표를 다른 따옴표로 이스케이프합니다. http://www.postgresql.org/docs/9.3/static/textsearch-controls.html에서 문서에 언급되어 있습니다. –

2

Lucene을 살펴 보는 것이 좋습니다. 그것은 기본적으로 자바에 통합 될 수 있습니다. NET에서 쉽게 또는 SOLR 및 PHP에서 웹 서비스를 사용합니다.

자유 텍스트 검색, 즉시 사용할 수있는 용어 순위, 다른 Analysers (스페인어 용 링크)을 사용하는 다른 언어에 대한 지원 기능이 뛰어납니다.

마지막으로 중요한 것은 너무 빠르다는 것입니다. (대용량의 경우 DB에서 4Gb 인덱스 ~ 5 000 000 행은 Postgres 데이터베이스보다 훨씬 빠릅니다).

+3

나는 elasticsearch를 사용하여 유사한 해결책을 제시 할 것이지만, 질문에 답하지 않기 때문에 받아 들일 수 없다. 감사! – jperelli

관련 문제