2017-01-18 8 views
1

Elasticsearch를 구성하여 "JaFNam"을 검색하면 "JavaFileName"에 대해 좋은 점수를 얻을 수 있습니다.CamelCase Search with Elasticsearch

저는 CamelCase pattern 분석기와 edge_ngram 토크 나이저를 결합한 분석기를 만들려고합니다. 나는이이 같은 용어 만들 것이라고 생각 :

J F N Ja Fi Na Jav Fil Nam Java File Name 

을하지만 토크 나이는 영향이하지 않는 것 같다 나는이 용어가 계속를 :

Java File Name 

무엇 것 같은 올바른 Elasticsearch 구성보기?


예제 코드 :에

curl -XPUT 'http://127.0.0.1:9010/hello?pretty=1' -d' 
{ 
    "settings":{ 
    "analysis":{ 
     "analyzer":{ 
     "camel":{ 
      "type":"pattern", 
      "pattern":"([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])", 
      "filters": ["edge_ngram"] 
     } 
     } 
    } 
    } 
} 
' 
curl -XGET 'http://127.0.0.1:9010/hello/_analyze?pretty=1' -d' 
{ 
    "analyzer":"camel", 
    "text":"JavaFileName" 
}' 

결과 :

{ 
    "tokens" : [ { 
    "token" : "java", 
    "start_offset" : 0, 
    "end_offset" : 4, 
    "type" : "word", 
    "position" : 0 
    }, { 
    "token" : "file", 
    "start_offset" : 4, 
    "end_offset" : 8, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "name", 
    "start_offset" : 8, 
    "end_offset" : 12, 
    "type" : "word", 
    "position" : 2 
    } ] 
} 
+0

'패턴'또는 'edge_ngram'중 하나만 사용할 수 있습니다. 동시에 둘 다 사용할 수는 없습니다. 게다가, 나는 왜 대소 문자가 어떤 차이를 만들어야하는지 잘 모르겠다. 'JaFNam'이나'jafnam'을 검색하는 것과 어떻게 다른가요? – Val

+0

@Val eclipse 및 IntelliJ IDE는 이러한 종류의 "사례 해석"을 사용합니다. 그들은'JaFNam'과'jafnam'을 다르게 해석합니다. 내 검색에 동일한 동작을 사용하고 싶습니다. – slartidan

+0

@Val 원하는 동작을 얻기 위해 'edge_ngram' 토크 나이저 대신'edge_ngram' * 필터 *를 사용할 수 있습니까? – slartidan

답변

2

당신 분석기 정의가 올바르지 않습니다. tokenizerfilter의 배열이 필요합니다. 분석기가 작동하지 않기 때문입니다. 대신 다음과 같이 시도하십시오 :

{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "camel": { 
      "tokenizer": "my_pattern", 
      "filter": [ 
      "my_gram" 
      ] 
     } 
     }, 
     "filter": { 
     "my_gram": { 
      "type": "edge_ngram", 
      "max_gram": 10 
     } 
     }, 
     "tokenizer": { 
     "my_pattern": { 
      "type": "pattern", 
      "pattern": "([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])" 
     } 
     } 
    } 
    } 
} 
+0

아, 그렇습니다. 'max_gram'은 기본적으로 2입니다. 내 대답을 업데이트했습니다 – Val

+0

쿨, 다행 그것은 도움이! – Val