2016-05-31 9 views
1

私は文書、フィールドでの各インデックスされている:私は、フィールド上の一致クエリを使用しようとするとelasticsearchに「接頭辞」と完全な文字列をマッチさせる方法はありますか?

document 1 has CodeName: "AAA01" 
document 2 has CodeName: "AAA02" 
document 3 has CodeName: "AAA03" 
document 4 has CodeName: "BBB02" 

:「コードネーム」次のような値を持っている

query: { 
"match": { 
"CodeName": "AAA" 
} 
} 

私が期待します"AAA01"と "AAA02"の結果を取得しますが、代わりに空の配列を取得しています。私が "AAA01"(私は全部をタイプする)を渡すと、結果が得られます。より一般的に一致するようにするにはどうすればよいですか?私は "マッチ"の代わりに "接頭辞"を使用してみましたが、同じ問題を抱えています。

"CodeName"のマッピングは "type": "string"です。

答えて

1

:私はelasticsearchを使用してのsymfonyの通行に慣れだと私たちはこのようにそれを使用している を"AAA01"と "AAA02"の場合

これは、Elastic Searchが期待するものではありません。 ESは、指定したトークナイザを使用して、文字列をトークンに分割します。トークナイザ/アナライザを指定しなかった場合、デフォルトの標準トークナイザはスペースやハイフンなどで単語を分割します。あなたの場合、トークンは「AAA01」、「AAA02」などのように格納されます。 「AAA」という言葉はありません。そのため、結果は戻ってきません。

この問題を修正するには、match_phrase_prefixクエリを使用するか、match_queryのタイプをphrase_prefixに設定します。このコードを試してみてください。ここで

"query": { 
     "match_phrase_prefix": { 
      "CodeName": "AAA" 
     } 
    } 

OR

"query": { 
     "match": { 
      "CodeName": { 
       "query": "AAA", 
       "type": "phrase_prefix" 
      } 
     } 
    } 

はドキュメントです:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html。また、max_expansionsパラメータにも注意してください。データに応じてこのクエリが遅くなることがあります。

この手法では、デフォルトマッピングを使用する必要があります。あなたはnGramを使わないでください。

+0

ありがとう!いつこの上にnGramを使用したいですか? – Rolando

+0

nGramは索引作成に時間がかかり、より多くの記憶域を必要としますが、同時にすべてのトークンが事前計算されているため、検索が高速になります。データセットが巨大で、 "AA"、 "AAA"、 "AAA0"、 "AAA01"などのトークンを複数組み合わせる必要がある場合は、nGramを使用すると意味があります。あなたのような限られたデータセットとシンプルな要件については、phrase_prefixは、通常は十分と簡単です。 – Ibrahim

0

私が最初に知っている限り、トークン化ツールnGramを使用してデータのインデックスを作成する必要がありました。

あなたはのdetailesに関連in documentation

COMMENT確認することができます。私は結果を得ることを期待

indexes: 
    search: 
     client: default 
     settings: 
      index: 
       analysis: 
        custom_index_analyzer: 
        type: custom 
        tokenizer: nGram 
        filter: [lowercase, kstem] 
       tokenizer: 
        nGram: 
         type: nGram 
         min_gram: 2 
         max_gram: 20 
    types: 
     skill: 
      mappings: 
       skill.name: 
        search_analyzer: custom_index_analyzer 
        index_analyzer: custom_index_analyzer 
        type: string 
        boost: 1 
+0

どうすれば設定できますか? "CodeName"フィールドにこれを明示的に宣言しなければなりませんか?もしそうなら、どうですか? – Rolando

+0

これまでに索引付けされた文書を索引付けするプロセスでは、まだ動作していないように見えますが、これは、すべての文書が索引付けを完了した後にアナライザーが起動するためです。現時点では、 AAA01 "が一致することができます。 – Rolando

+0

ローカルマシンで作業している場合は、ブラウザで 'http://127.0.0.1:9200/_cat/indices?v'を開いてすべてのインデックスと' http://127.0.0.1:9200/ /_search /?type = &pretty = true'特定のタイプの詳細を確認する –

関連する問題