2016-10-20 3 views
0

나는 이름을 검색하는 데 solr을 사용하고 부분 일치를 일치시킵니다. 최소 2를 사용하여 I 얻을 "밥 스미스"에 대한 다음 ngrams :Solr ngrams는 공백을 포함하는 방법

  • 는 스미스

이를

  • SMIT에
  • SM
  • SMI 그러나 "bob s"는 포함되지 않으며 쿼리를 검색하면 아무 것도 반환하지 않습니다. 해당 형식을 ngram으로 포함시키기 위해 어떤 옵션이 있습니까? 다음은 현재 사용중인 필드 유형입니다.

    <fieldType name="edgytext" class="solr.TextField" positionIncrementGap="100"> 
        <analyzer type="index"> 
        <tokenizer class="solr.StandardTokenizerFactory"/> 
        <filter class="solr.LowerCaseFilterFactory"/> 
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="25" /> 
        </analyzer> 
        <analyzer type="query"> 
         <tokenizer class="solr.KeywordTokenizerFactory"/> 
         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
         <filter class="solr.LowerCaseFilterFactory"/> 
        </analyzer> 
        </fieldType> 
    
  • 답변

    1

    다른 토큰 장치를 사용하고 있으므로 결과가 달라집니다. KeywordTokenizer는 검색 입력 만 단일 토큰으로 직접 제공합니다. StandardTokenizer를 사용하면 작동하지만 'bob'smith '에 대한 제안으로'smith bob '을 제공 할 것입니다.

    대안은 index the content as shingles as well에 - 당신은 (싱글 생성에 사용 두에 주어진 예) 토큰에서 대상 포진 만들 수 있도록 :

    밥 스미스 주니어. => 밥 스미스, 스미스 주니어.

    .. 다음주는 그 기반으로 edgengrams을 생성합니다

    보 밥 밥 밥의 밥 SM 에게 ...

    등 싱글 공장도 실제이 포함됩니다 토큰을 사용하면 여전히 '스미스'만 찾을 수 있습니다.

    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ShingleFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="25" /> 
    </analyzer> 
    

    .. 요 허용 토큰이 더 있어야합니다. u 다음에 서로 일치하는 토큰. 순차적 인 토큰 두 개 이상을 포함 시키려면 maxShingleSize을 조정할 수 있습니다.

    또한 텍스트의 처음부터 자동 완성을 수행하려는 경우 인덱싱에 Lowercasefilter가있는 KeywordTokenizer를 사용하고 검색을 위해 와일드 카드를 사용하면됩니다 (텍스트를 소문자로 보내어 Solr로 보내면, 모든 분석은 와일드 카드로 건너 뛰기 때문에). 이것은 또한 edgengram과 함께 KeywordTokenizer와 함께 작동합니다.

    +0

    이 솔루션은 만들어지는 ngram의 측면에서 저에게 효과적이었습니다.하지만 "밥 s"을 검색하면 아무 이유없이 얻을 수 있지만 "밥 sm"을 검색하면 원하는 결과를 얻을 수 있습니다. 나는 mm 1과 2를 사용하여 시도했다. – user3688241

    +0

    관리 인터페이스 아래의 분석 탭을 사용하여 비교가 중단 된 부분을 확인한다. – MatsLindh

    0

    당신은 다음과 같이 쿼리 분석기뿐만 아니라 인덱스 분석기에 KeywordTokenizerFactory를 사용해야합니다 : 당신이 전체 문자열에 edgeNgram 필터를 적용합니다 색인 때

    <fieldType name="edgytext" class="solr.TextField" positionIncrementGap="100"> 
        <analyzer type="index"> 
        <tokenizer class="solr.KeywordTokenizerFactory"/> 
        <filter class="solr.LowerCaseFilterFactory"/> 
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="25" /> 
        </analyzer> 
        <analyzer type="query"> 
         <tokenizer class="solr.KeywordTokenizerFactory"/> 
         <filter class="solr.LowerCaseFilterFactory"/> 
        </analyzer> 
        </fieldType> 
    

    이 방법보다는 토큰. StandardTokenizer에서 "bob", "smith"대신 "bob smith"로 토큰 화되며 "b", "bo", "bob", "bob s"등으로 필터링됩니다.

    관련 문제