2011-03-09 4 views
2

Lucene은 기본적으로 지원하지 않으므로 쿼리를 작성하는 데 도움이 필요합니다.Lucene 부분 일치 검색

는 "개발"

내가이 문서는 "베다" "데브"및 검색을 위해 반환 싶습니다 내가 필드 값을 가진 문서가 있다고 가정 할 수 있습니다.

두 개의 검색어를 만들 수 있습니까?

"*keyword" 

"keyword*" 

"keyword" 

?

어떻게 여러 단어로이 작업을 수행합니까? 문장/검색을 단어 목록으로 분리하고 각 단어에 대해 이전 예제를 수행 하시겠습니까?

답변

9

당신이 정확하게 당신을 이해하면 무엇 아니 큰 쿼리 엔진에서 가능합니다.
Lucene은 용어 - 문서 행렬 및 거꾸로 된 파일 기술을 사용하여 키워드에 대한 색인을 생성합니다 (하단의 링크 참조). 완전히 본격적인 문자열 매칭은 매우 좋지만 확장 할 수는 없습니다 : 수용 가능한 시간에 적당한 크기의 색인을 말로 표현할 수는 없습니다.

은 아직 여기에 도움이 될 두 개의 아이디어 ...
이 '개발'로 예에 돌아올

음절 토큰입니다. 오랫동안 사용자가 음절을 검색하게하여 행복하다면 뭔가를 할 수 있다고 생각합니다. 인덱싱 된 단어를 음절에 따라 분할하고 음절 위에 데이터베이스 인덱스를 만드는 tokenizer를 사용해야합니다. (내가 할 수있는 영어를위한 토큰 화기가 내장되어 있는지 잘 모르겠다. 스스로 작성하는 것이 까다로울 수도있다 ...)

주목할 중요한 점은
전체 단어 인덱스의 크기가 다른 음절은 두 가지 중 하나만 색인을 생성하는 것보다 훨씬 큽니다.

나는 음절만을 색인 할 것을 제안하지 않습니다. 사용자가 전체 단어 'Develop'을 검색 할 수있게하려면 (원하는 경우) 사이의 두 검색어, 즉 < 'dev'AND 'lop'>가 표시됩니다. Lucene은 이러한 논리 구조를 쿼리에서 지원하지만 매우 비쌉니다. Lucene에서 논리적 쿼리를 사용하여 개인적으로 문제가 발생했습니다.
어떻게 든 당신이 첫 음절 단어를 줄기 형태소 단어의 잔인한 형태 (http://en.wikipedia.org/wiki/Stemming)를 사용하는 수 하려는지에 도착하는 또 다른 방법은 형태소

. (이렇게하면 'dev'를 검색 할 수 있지만 'lop'은 검색 할 수 없습니다.)
다시 말하지만, 저는 이러한 단어 줄기 기능이 이미 Lucene에 있다고 생각하지 않습니다. 너 자신을 위해 하나를 쓰는 것은 고통이며 거대한 사전과 함께 작업하거나 가져올 것입니다.
http://en.wikipedia.org/wiki/Index_%28search_engine%29
http://en.wikipedia.org/wiki/Vector_space_model
http://en.wikipedia.org/wiki/Inverted_file
http://en.wikipedia.org/wiki/Term-document_matrix
http://en.wikipedia.org/wiki/Tf-idf

:이 당신이 검색 엔진 내부에 대해 알고하지 않은 경우에보고 될 수

링크