2016-08-04 19 views
1

Elasticsearch 2.x에서 내 analzyer에서 "소문자"필터를 사용하면서 (대문자 소문자를 구별하지 않도록 사용) 일반 영어 단어 "can"에서 머리 글자 어 "CAN"을 어떻게 구별 할 수 있습니까?탄성 검색 - 소문자 필터를 사용하는 동안 대문자 약자를 어떻게 보존 할 수 있습니까?

내가 사용하고 사용자 정의 분석은 다음과 같습니다 인덱스 때

"analyzer": { 
    "tight": { 
     "type": "custom", 
     "tokenizer": "standard", 
     "stopwords": "_english_", 
     "filter": ["lowercase", "asciifolding"] 
    } 
} 

, 대문자 글자가 "CAN은"내 분석기를 칠 때, 그것은 영어 단어 "수"가된다. 그런 다음 "CAN"을 검색하면 영어 단어 "can"이있는 모든 문서를 가져옵니다. 나는 단지 대문자 "CAN"을 포함하는 문서 만 원한다. 유사한 패턴으로 떨어지는 다른 두문자어가있을 수 있습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

1

달성하기위한 한 가지 방법은 lowercase 토큰 필터가없는 다른 분석기를 만들고 기본 분석기의 하위 필드에서 분석기를 사용하는 것입니다. 다음과 같이 구성됩니다.

두 개의 분석기 tighttight_acronym으로 색인을 생성하십시오.

다음
PUT index 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "tight": { 
      "type": "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "asciifolding" 
      ] 
     }, 
     "tight_acronym": { 
      "type": "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "asciifolding" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "field": { 
      "type": "string", 
      "analyzer": "tight", 
      "fields": { 
      "acronyms": { 
       "type": "string", 
       "analyzer": "tight_acronym" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

우리 인덱스 두 문서 : 전자는 fieldfield.acronyms 서브 필드에 후자에 할당하면 (서브 필드에) CAN을 검색하는 경우 다음

PUT index/test/1 
{ "field": "It is worth CAN 300" } 
PUT index/test/2 
{ "field": "can you do it?" } 

을 당신은 (주 필드) can 검색 할 경우, 당신은 당신이 두 번째 문서를 얻을 수 있습니다 첫 번째 문서를

POST index/test/_search 
{ 
    "query": { 
    "match": { 
     "field.acronyms": "CAN" 
    } 
    } 
} 

을 얻을 것입니다

POST index/test/_search 
{ 
    "query": { 
    "match": { 
     "field": "can" 
    } 
    } 
} 
+0

첫 번째 문제점은 대소 문자를 구분하지 않고 일치 검색을 수행하기 위해 소문자 필터로 필드를 검색해야한다는 것입니다. 즉, 약어 "CAN"이 항상 첫 번째 기준과 일치한다는 것을 의미합니다 . 내가 작업하고있는 솔루션은 "CAN"이라는 약어를 "ccaann"으로 대체하는 char_filter를 추가 한 다음 내 머리 글자 어를 대문자로 대체하는 내 머리 글자 대체 목록을 가지고 있습니다. – Redtopia

+1

충분합니다. 해당 경로를 선택하는 경우 [동의어 토큰 필터] (https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html)를 대신 사용하는 것이 좋습니다. 클라이언트 코드를 전혀 수정하지 않아도됩니다. 동의어 파일을 큐레이팅하기 만하면됩니다. – Val

+0

그것은 재미있는 생각입니다. 따라서 CAN이 "ccaann"으로 색인이 생성되면 내 동의어는 "CAN, ccaann"이 맞습니까? – Redtopia