2017-10-26 4 views
0

내 웹 사이트에서 부분 검색이 필요했습니다. 처음에는 edgeNgramFeild를 사용하여 예상대로 작동하지 않았습니다. 사용자 정의 분석기가있는 사용자 정의 검색 엔진을 사용했습니다. 장고 - 건초 더미를 사용하고 있습니다. edgeNgram 필터가있는 사용자 정의 분석기가 작동하지 않습니다.

'settings': { 
     "analysis": { 
      "analyzer": { 
       "ngram_analyzer": { 
        "type": "custom", 
        "tokenizer": "lowercase", 
        "filter": ["haystack_ngram"] 
       }, 
       "edgengram_analyzer": { 
        "type": "custom", 
        "tokenizer": "lowercase", 
        "filter": ["haystack_edgengram"] 
       }, 
       "suggest_analyzer": { 
        "type":"custom", 
        "tokenizer":"standard", 
        "filter":[ 
         "standard", 
         "lowercase", 
         "asciifolding" 
        ] 
       }, 
      }, 
      "tokenizer": { 
       "haystack_ngram_tokenizer": { 
        "type": "nGram", 
        "min_gram": 3, 
        "max_gram": 15, 
       }, 
       "haystack_edgengram_tokenizer": { 
        "type": "edgeNGram", 
        "min_gram": 2, 
        "max_gram": 15, 
        "side": "front" 
       } 
      }, 
      "filter": { 
       "haystack_ngram": { 
        "type": "nGram", 
        "min_gram": 3, 
        "max_gram": 15 
       }, 
       "haystack_edgengram": { 
        "type": "edgeNGram", 
        "min_gram": 2, 
        "max_gram": 15 
       } 
      } 
     } 
    } 

는 검색 색인에 대한 edgengram_analyzersuggest_analyzer 사용합니다. 이것은 어느 정도는 효과가있었습니다. 그러나 30을 입력하면 30을 검색하지 않고 알파벳과 숫자가 결합 된 단어를 검색하는 등 숫자에 대해서는 작동하지 않습니다. 그래서 여러 사이트를 검색했습니다. 그들은 표준 또는 whitespace 토크 나이를 사용하는 suggestsed과 haystack_edgengram로이 숫자 부분 검색 제안 후 alphabet.The 설정에 대해서도 작동하지 않았다 옆으로 퍼 팅, 전혀 작동하지 않았다 filter.But :

'settings': { 
     "analysis": { 
      "analyzer": { 
       "ngram_analyzer": { 
        "type": "custom", 
        "tokenizer": "lowercase", 
        "filter": ["haystack_ngram"] 
       }, 
       "edgengram_analyzer": { 
        "type": "custom", 
        "tokenizer": "whitepsace", 
        "filter": ["haystack_edgengram"] 
       }, 
       "suggest_analyzer": { 
        "type":"custom", 
        "tokenizer":"standard", 
        "filter":[ 
         "standard", 
         "lowercase", 
         "asciifolding" 
        ] 
       }, 
      }, 
      "filter": { 
       "haystack_ngram": { 
        "type": "nGram", 
        "min_gram": 3, 
        "max_gram": 15 
       }, 
       "haystack_edgengram": { 
        "type": "edgeNGram", 
        "min_gram": 2, 
        "max_gram": 15 
       } 
      } 
     } 
    } 

아무것도합니까 lowercase tokenizer가 django-haystack과 작동합니까? 또는 haystack_edgengram 필터가 작동하지 않습니다. 내 지식에 따르면 이처럼 작동해야합니다. 문자로 2 Lazy Dog으로 간주됩니다. 이런 식의 토큰을 whitespace[2,Lazy,Dog]으로 가져와야합니다. haystack_edgengram 필터를 적용하면 [2,la,laz,lazy,do,dog] 토큰을 생성해야합니다. 이처럼 작동하지 않습니다. 내가 잘못 했나요?

필자의 요구 사항은 예를 들어 텍스트 2 Lazy Dog 중 일부 유형이 작동해야합니다. 감사합니다.

편집 : 내 가정 소문자 tokernizer에서이 properly.But은, 위의 텍스트의 경우는 2을 생략 할 일 토큰 [lazy,dog] 왜 개개인이 아닌 표준 또는 공백이 작동 토크 나이 수 생성?

도와주세요.

답변

1

ngrams 필터 u는 생성 된 토큰의 최소 길이 인 min_gram을 정의합니다. 귀하의 경우 '2'길이가 : 1 그래서 이것은 ngram 필터에서 무시됩니다.

가장 쉬운 방법은 min_gram을 1로 변경하는 것입니다. 좀 더 복잡한 방법은 전체 키워드 (짧은 용어의 경우 유용)와 부분 일치의 경우 ngram analzyer (더 긴 용어의 경우)) - 어쩌면 몇 가지 bool 쿼리.

ngrams를 '1'문자로 시작하도록 변경할 수도 있지만 검색 창에서 적어도 3 자 이상이어야 ealsticsearch에 쿼리를 보낼 수 있습니다.

관련 문제