2017-01-18 5 views
1

Elasticsearchを設定したいので、 "JaFNam"を検索すると "JavaFileName"のスコアが高くなります。CamelCase Search with Elasticsearch

キャメルケース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

「pattern」または「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