2017-02-16 1 views
0

"A", "EF" "CDE"와 같은 부분 문자열을 찾은 모든 결과를 얻을 수 있도록 검색 방법은 어떻게합니까? "ABCDEF"Solr - 주어진 문자열의 모든 부분 문자열 검색

일부 문자가 누락 될 수있는 문자열을 검색 할 때 "BDE"와 같은 결과가 나오기 때문에 regex를 사용하는 데 문제가 있습니다.이 경우 "C"를 건너 뛰기가 허용되어 유효하지 않습니다.

+0

검색어를 사용해 보셨습니까? – Mysterion

+0

NGramFilter를 사용해 보셨습니까? – MatsLindh

+0

귀하의 질문은 매우 불분명합니다. 색인을 생성하고 찾으려고하는 텍스트 (ABCDEF)는 무엇입니까? 그리고 검색 문자열 (A, EF 등)은 무엇입니까? –

답변

0

텍스트 필드에 대한 분석 체인에서 NGramFilter (토크 나이저가 아님)를 사용할 수 있습니다. 제출 된 텍스트의 각 하위 문자열에 대해 텍스트를 별도의 토큰으로 분할합니다. 하위 문자열의 최소/최대 길이를 제공하여 생성 된 토큰의 길이를 조정할 수 있습니다.

귀하의 의견은 당신이 KeywordTokenizer 사용의 하위 문자열을 검색 할 단지 단일 문자열 인 경우 - 다음 generate the substrings with the NgramFilter에 사용되는 단일 토큰으로이 입력을 유지합니다 문자열 :

<filter class="solr.NGramFilterFactory"/> 

기본값은 분에 대한 값/최대는 (예제에서) 제공하는 1, 2 :

귀하의 경우
In: "four score" 
Tokenizer to Filter: "four", "score" 
Out: "f", "o", "u", "r", "fo", "ou", "ur", "s", "c", "o", "r", "e", "sc", "co", "or", "re" 

전체 문자열이 하나의 값으로 유지 될 것입니다 당신이 대신 "네 점수"가 줄 수 있도록 토큰을 분리합니다.

위키의 예제에서 1/4 값에 주어진 예제는 현재 잘못되었습니다 (EdgeNGramFilter에서 복사 된 것처럼 보임). 따라서 무시하십시오.

콘텐츠를 쿼리하는 방법에 따라 최소/최대 값을 조정해야합니다. 길이가 3보다 작은 부분 문자열을 쿼리하지 않으려면 3을 최소값으로 사용하십시오.

+0

정말 고마워요. 설명은 매우 도움이됩니다 :) – Pie222

0

내가 사용 사례에 대한 구체적인 분석 체인을 사용하는 것이 좋습니다 :

<fieldType name="text_ngram" class="solr.TextField"> 
    <analyzer type="index"> 
     ... 
     <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/> 
    </analyzer> 
    <analyzer type="query"> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt" /> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory" 
       generateWordParts="1" generateNumberParts="1" catenateWords="0" 
       catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
</fieldType> 

N.B. 예기치 않은 동작을 원하지 않으면 쿼리 시간에 Ngram 토큰 필터링을하지 마십시오.

[1] https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions#FilterDescriptions-N-GramFilter