2016-04-19 17 views
0

新生児質問のelasticsearch。私はこれが私の名前「JUSTIN」を返さないような部分テキスト一致の弾性検索照合クエリ

search_response = es.search(index = 'sample', body = {'query':{'match':{'first_name':"JUST"}}}) 

elasticsearchのLuceneインデックスといくつかの用語を含む名前を検索に使用し、設定しているが、次のクエリでは、

search_response = es.search(index = 'sample', body = {'query':{'match':{'first_name':"JUSTIN"}}}) 

を何私は間違っている?クエリに "一致"しないと、その用語を含むレコードが返されますか?おかげさまで

+0

の可能性のある重複した[Elasticsearch:サブストリングの一致を検索](http://stackoverflow.com/questions/23243867/elasticsearch-find-substring-match) – BlackPOP

+0

いいえ、 'query'はあなたに記録する場合を取得することはできません一致'JUST'を検索します。あなたは 'ワイルドカードクエリ'でJUST *を試すことができます – Richa

答えて

0

edgeNGram token filterを使用するカスタムアナライザを作成することで、このニーズを処理する最善の方法があります。ワイルドカードを忘れて、クエリ文字列に*を使用すると、それらはすべてedgeNGramのアプローチよりもパフォーマンスが低いです。

このようにインデックスを作成してから、データをインデックスに再作成する必要があります。 jjujusjustjustijustin、JUSTINの基本的にすべてのプレフィックス:first_name: JUSTINのインデックスを作成する際に

curl -XPUT http://localhost:9200/sample -d '{ 
    "settings": { 
     "analysis": { 
      "filter": { 
       "prefixes": { 
        "type": "edgeNGram", 
        "min_gram": 1, 
        "max_gram": 15 
       } 
      }, 
      "analyzer": { 
       "my_analyzer": { 
        "type": "custom", 
        "tokenizer": "standard", 
        "filter": ["lowercase", "prefixes"] 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "your_type": { 
      "properties": { 
       "first_name": { 
        "type": "string", 
        "analyzer": "my_analyzer", 
        "search_analyzer": "standard" 
       } 
      } 
     } 
    } 
}' 

その後、次のインデックス付きのトークンを取得します。

これで、2番目のクエリで検索し、実際に期待する結果を見つけることができます。

search_response = es.search(index = 'sample', body = {'query':{'match':{'first_name':'JUST'}}}) 
+0

これは役に立ちましたか?もっと情報が必要ですか? – Val