2012-06-18 2 views
6

네덜란드어와 독일어에는 과 결합 할 수있는 단어가 있습니다. words; 복합 단어.Solr 복합어 워드 토크 나이저 - 결과가 OR 문으로 처리됩니다.

예를 들어 "accountmanager"는 "account"및 "manager"라는 단어로 합성 된 한 단어로 간주됩니다. 우리 사용자는 문서 및 쿼리에서 "accountmanager"및 "account manager"를 사용하고 두 쿼리에 대해 동일한 결과를 기대합니다.

<filter class="solr.DictionaryCompoundWordTokenFilterFactory" dictionary="../../compound-word-dictionary.txt" minWordSize="8" minSubwordSize="4" maxSubwordSize="15" onlyLongestMatch="true"/> 

화합물 단어-하는 dictionary.txt 파일이 단어의 목록을 원하는 분야 (분할) 단어를 decompound에

이 수 있으려면, SOLR 내가 스키마에 설정 한 사전 필터가 복합 단어를 분해하는 데 사용됩니다. 이 목록에서 "account"와 "manager"라는 단어를 찾을 수 있습니다.

decompound 결과는 괜찮습니다, 쿼리 "같은 관리자"로 검색 할 때 SOLR 디버거에서 분석 할 때 : (용어 텍스트) :

  • 같은 관리자
  • 계정
  • 관리자

그러나이 결과는 OR 문으로 처리되고 적어도 하나의 용어가있는 모든 문서를 찾습니다. 나는 그것이 AND 문처럼 행동하기를 원한다. (그래서 나는 문서에서 "account"와 "manager"라는 용어를 모두 가지고있는 결과만을 원한다).

스키마의 defaultOperator를 "AND"로 설정하려고 시도했지만 edismax을 사용할 때 무시됩니다. 그래서 제안 된 최소 일치을 원하는 결과없이 다시 100 % (mm = 100 %)로 설정했습니다. 스키마에서 사전 필터의 속성을 조정해도 비헤이비어가 "AND"로 변경되지 않습니다.

사전 복합 단어 토큰 팩토리를 사용할 때 누구도이 문제를 보았으며 AND 문과 같이 작동하도록하는 솔루션을 알고 있습니까?

답변

3

예상대로 작동하지만 DictionaryCompoundWordTokenFilterFactory는 '내부 단어'를 추가 한 것입니다.이 경우에는 'account'와 'manager'를 모두 추가하지만 예를 들어 'accountbanana' '바나나'는 사전에 없기 때문에 '계정'만 추가됩니다.

이 정보는 '관리자'를 찾고 'accountmanager'가있는 문서를 찾는 사람에게 유용합니다. 당신이 원하는 행동 (난 당신이 쿼리 측에서이를 적용하고 이해)는 같은 관리자 = "계정 관리자"

+0

설명해 주셔서 감사합니다. DictionaryCompoundWordTokenFilterFactory의 동작에 대한 명확한 대답. 나는 그 사용법을 오해하여이 경우에 나의 필요를 충족시키지 못한다는 것을 알았습니다. 제안한 힌트가 실제로 다음 단계 (solr.SynonymFilterFactory 사용)입니다. 복잡한 단어 필터 팩토리와 함께 동의어 필터를 단순화하기를 바랬습니다. –

2

그냥 머리까지하게 사전을 사용할 수를 얻기 위하여

내가 데려 갈거야으로 이걸 살펴보면 추가 노이즈가 많이 발생합니다. SOLR 3.6은 CompoundWordTokenFilterBase에서 각 깨진 토큰의 위치 증가분을 0으로 설정하기 때문에 정확하게 정렬하는 쿼리를 얻을 수 있습니다. 그러나 쿼리 할 때 AnalyzerQueryNodeProcessor는 positionCount == 1인지 확인하기 때문에 복잡한 단어의 거대한 OR 쿼리를 받게됩니다.

예를 들어 Castaway를 검색하면 (castaway 또는 cast 또는 away)를 쿼리합니다.이 기능을 사용하면 캐스트 어웨이 (Castaway)가 작동하지만 어웨이 ("Away"또는 "Cast")가있는 모든 것을 얻을 수 있습니다.

실제로 Lucene을 setPositionIncrement에 1을 패치하고 AnalyzerQueryNodeProcessor에 몇 가지 추가 코드를 추가하여 ORD PhraseQueryNodes가있는 위치에 "castaway"또는 "cast away"를 추가합니다. 이것은 또한 부정확하지만 잡음을 감소시킵니다. 구문 분석은 (castaway0, cast1, away2) "castaway away"결과를 반환 할 수 있기 때문에 항상 position을 1로 설정하면 이상한 결과를 반환 할 수 있습니다. 또한 이후 용어의 위치는 이제 꺼져 있습니다. 더 자세한 설명은 다음을 참조하십시오. http://blog.mikemccandless.com/2012/04/lucenes-tokenstreams-are-actually.html

관련 문제