2016-08-24 9 views
0

私はこのElasticsearch検索

select * from table where full_name like '%q%' or address like '%q%' or description like '%q%' order by full_name , description , address 
+1

あなた自身で何かを書こうとしましたか? – Dekel

+0

はい、しかしmulti_matchにはphrase_prefixしかありませんが、私はワイルドカードのように見分ける必要があります – feeling

+0

全文検索について少しお読みください。 – Dekel

答えて

2

ワイルドカードクエリは、いくつかのフィールドで検索する場合は特に、非常に高価になることができます。これを行う正しい方法は、の一部だけを検索するフィールドにnGram token filterを使用することです。

まずあなたがスライスし、検索可能なトークンに自分のフィールドをダイスするカスタム・アナライザで以下のようにインデックスを作成します。

curl -XPUT localhost:9200/tests -d '{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "substring_analyzer": { 
      "tokenizer": "standard", 
      "filter": ["lowercase", "substring"] 
     } 
     }, 
     "filter": { 
     "substring": { 
      "type": "nGram", 
      "min_gram": 1, 
      "max_gram": 15 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "full_name": { 
      "type": "string", 
      "analyzer": "substring_analyzer" 
     }, 
     "address": { 
      "type": "string", 
      "analyzer": "substring_analyzer" 
     }, 
     "description": { 
      "type": "string", 
      "analyzer": "substring_analyzer" 
     } 
     } 
    } 
    } 
}' 

その後インデックスすることができますいくつかのドキュメント:最後に

curl -XPUT localhost:9200/tests/test/_bulk -d ' 
{"index":{"_id": 1}} 
{"full_name": "Doe", "address": "1234 Quinn Street", "description": "Lovely guy"} 
{"index":{"_id": 2}} 
{"full_name": "Brennan", "address": "4567 Main Street", "description": "Not qualified"} 
{"index":{"_id": 3}} 
{"full_name": "Quantic", "address": "1234 Quinn Street", "description": "New friend"} 
' 

、上記のSQLクエリに相当するクエリで検索することができ、3つのテストドキュメントはすべて一致します:

curl -XPUT localhost:9200/tests/test/_search -d '{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "full_name": "q" 
      } 
     }, 
     { 
      "match": { 
      "address": "q" 
      } 
     }, 
     { 
      "match": { 
      "description": "q" 
      } 
     } 
     ] 
    } 
    } 
}' 
関連する問題