2010-05-06 5 views
5

큰 성 (lastname) 목록에서 부분 시작 일치를 검색하려고합니다. 그래서 Wein 사용자 *이 와인버그을 찾아야한다, Weinkamm 등Solr에서 부분 시작 부분 일치를 수행하는 방법?

나는 특별한 필드를 만들고,의 schema.xml 년 형 사양

<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" preserveOriginal="1"/>

를 추가하여이 작업을 수행 할 수 있습니다. 위의 행을 인덱싱 분석기에만 추가하고 쿼리 분석기를 비워두면 special_field : Wein을 검색하여 예상되는 결과를 얻을 수 있습니다.

이제 solr에도 * - 구문이 있음을 알 수 있습니다. EdgeNGramFilterFactory와 * -syntax 사이의 연결은 무엇입니까?

나는 올바르게 일을하고 있습니까? 아니면 더 나은 방법이 있습니까?

감사합니다.

답변

1

Wein * 쿼리를 사용하지 않는 것이 좋습니다. 이는 내부적으로 PrefixQuery로 구현되며 접두어가 "Wein"인 모든 용어를 포함하도록 원래 쿼리를 다시 작성합니다. 색인의 크기에 따라 (이 용어의 수를 의미 함)이 쿼리 재 작성은 병목 현상이 될 수 있습니다.

인덱스 시간에 EdgeNGramFilter가 더 나은 방법입니다. 이 솔루션은 더 많은 공간을 사용하지만 쿼리는 훨씬 빠르게 처리됩니다.

+0

덕분에 나는 또한 좋은 답변을받은 루씬 포럼에서이 질문을했다. 나는 많은 쿼리 용어를 기대하지 않으므로 와일드 카드 구문을 사용하여 매우 만족합니다. – CruftyCraft

+0

나는 쿼리 용어가 아닌 인덱스 용어의 개수를 참조합니다. Solr/Lucene은 모든 색인 된 용어에 대해 선형 검색을 수행하여 동일한 접두어를 갖는 용어의 하위 집합을 선택합니다. 부분 집합이 선택되면 해당 용어가 포함되도록 쿼리가 확장됩니다. 따라서 병목 현상은 선형 검색입니다. 그렇다면 색인에 용어가 적지 않다면 EdgeNGramFilter를 권장합니다. – Rodes

+0

나는 이해한다. 성능 제한을 초과하면이 방향에서 동일한 변경을 수행 할 수 있습니다. 감사. – CruftyCraft

3

또는 단순한 와일드 카드 일치 할 :

name:Pe* 
관련 문제