부품 번호를 처리해야하는 Solr 색인이 있습니다 (WordDelimiterFilterFactory
은 이상적으로 적합합니다). 부품 번호의 예로는 "CH2300-100"이 있습니다. 나는이 분야에 맞게 다음과 같은 쿼리를 기대하고있어 (그리고 그들은 할) :모든 순열을 포함하지 않는 WordDelimiterFilterFactory
- CH
- CH2300100
- 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>
재미있는 : 워드 구분 필터 공장 후에이 줄을 추가하면 문제를 해결해야한다. 첫 번째 두 가지 솔루션은 기존 기능을 손상 시키지만 (마지막으로 언급 한대로) 나는 지난 것을 매우 좋아합니다. 단 하나의 관심사는 부품 번호 (예 : 자유 텍스트에 포함 된 부품 번호) 이상의 부품을 포함하는 필드에 적용하면 조약돌 필터에서 잘못된 토큰으로 끝날 것입니다. 조건부 필터를 조건부로 적용하는 방법이 있습니까 (예 : 구분 기호 필터가 여분의 토큰을 생성 한 경우)? – condit
catnum 이외의 필드를 위반하는 것이 걱정된다면, shingle 필터 팩토리가없는 다른 필드에 대해 새 fieldType을 만들 수 있습니다. catnum 필드의 다른 값을 위반하는 것에 대해 걱정할 경우 솔루션이 더 복잡해집니다. –
도움 주셔서 감사합니다. 복잡한 해결책의 요지는 무엇입니까? 사용자 정의 필터 작성? – condit