2013-07-17 3 views
1

부품 번호를 처리해야하는 Solr 색인이 있습니다 (WordDelimiterFilterFactory은 이상적으로 적합합니다). 부품 번호의 예로는 "CH2300-100"이 있습니다. 나는이 분야에 맞게 다음과 같은 쿼리를 기대하고있어 (그리고 그들은 할) :모든 순열을 포함하지 않는 WordDelimiterFilterFactory

  • CH
  • CH2300100

  • CH2300-100
  • 그러나 다음 쿼리는 일치하지 않습니다

    • CH2300

    디버깅 출력을 보면 단어 부분 조합이 생성되지 않습니다. catenateWords 및/또는 catenateNumbers 속성이이 문제를 처리 할 것으로 예상되지만 제대로 작동하지 않는 것으로 보입니다. 구성에서 토큰 화 된 조각의 모든 순열을 일치시킬 수있는 항목이 누락 되었습니까?

    <schema version="1.5" name="test"> 
        <types> 
        <fieldType name="text" class="solr.TextField"> 
         <analyzer type="index"> 
         <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="0" preserveOriginal="1" /> 
         </analyzer> 
         <analyzer type="query"> 
         <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
         </analyzer> 
        </fieldType> 
        </types> 
        <fields> 
        <field stored="true" name="id" type="text" /> 
        <field stored="true" indexed="true" name="catnum" type="text" /> 
        </fields> 
        <uniqueKey>id</uniqueKey> 
    </schema> 
    

    답변

    3

    splitOnNumerics = "1"이므로 'CH2300'은 색인 된 토큰이 아닌 것으로 생각됩니다. 분할 단계에서 CH와 2300을 분리 한 다음 모든 생성기를 개별적으로 적용합니다 (결합 된 토큰뿐만 아니라).

    하나의 옵션은 필터 팩토리에 splitOnNumerics = "0"을 추가하는 것입니다. 그러나 이는 'CH'와 일치하지 않을 수 있습니다. 또 다른 옵션은 쿼리 타임에 숫자를 나누는 필터 팩터 리를 추가하는 것입니다.

    편집

    세 번째 가능성이 더 나은 옵션은 shingle filter factory을 사용하고 =이 "1"CH, 2300, 및 CH2300의 모든 있도록하는 색인을 생성 splitOnNumerics을 떠날 것입니다.

    <filter class="solr.ShingleFilterFactory" tokenSeparator=""/>

    +0

    재미있는 : 워드 구분 필터 공장 후에이 줄을 추가하면 문제를 해결해야한다. 첫 번째 두 가지 솔루션은 기존 기능을 손상 시키지만 (마지막으로 언급 한대로) 나는 지난 것을 매우 좋아합니다. 단 하나의 관심사는 부품 번호 (예 : 자유 텍스트에 포함 된 부품 번호) 이상의 부품을 포함하는 필드에 적용하면 조약돌 필터에서 잘못된 토큰으로 끝날 것입니다. 조건부 필터를 조건부로 적용하는 방법이 있습니까 (예 : 구분 기호 필터가 여분의 토큰을 생성 한 경우)? – condit

    +0

    catnum 이외의 필드를 위반하는 것이 걱정된다면, shingle 필터 팩토리가없는 다른 필드에 대해 새 fieldType을 만들 수 있습니다. catnum 필드의 다른 값을 위반하는 것에 대해 걱정할 경우 솔루션이 더 복잡해집니다. –

    +0

    도움 주셔서 감사합니다. 복잡한 해결책의 요지는 무엇입니까? 사용자 정의 필터 작성? – condit

    관련 문제