たなちの開発日誌

自分の知識をストックしていくためのブログ

Elasticserchのクエリについてメモ

fuzzyな検索ができるもの。

参考にさせていただいたサイト
Elasticsearchチュートリアル - 不可視点

実践!Elasticsearch - Wantedly Engineer Blog

Elasticsearchのクエリとフィルターで簡単な検索を試す例 | EasyRamble

queriesとfiltersの2種類の方法があったらしいが
公式ドキュメントによるとquery context, filter contextにマージされた模様。
Queries | Elasticsearch Reference [5.1] | Elastic

以下、google翻訳に頼って理解した内容のメモ

・query context

ドキュメントがこのクエリ句に
どれくらいうまく一致するかを表すスコアを計算します。

・filter context

「ドキュメントがこのクエリ句に一致しますか?」という質問に答えます。答えは単純かどうかです。スコアは計算されません。
フィルタコンテキストは、主に構造化データのフィルタリングに使用されます。
頻繁に使用されるフィルターは、パフォーマンスをスピードアップするために、Elasticsearchによって自動的にキャッシュされます。

つまり、どれくらい一致しているかを見るときだけqueryを使うと。filterはキャッシュ機能付きの普通のSQLの検索と同じようなものという感覚。

基本的なクエリの書き方

Query and filter context | Elasticsearch Reference [5.1] | Elastic

curl -XGET 'localhost:9200/_search?pretty' -d'
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}'

"title","content", "status","publish_date"はフィールド名。
boolと2つのmatch句はクエリコンテキストで使用されます。つまり、各ドキュメントがどれだけうまく一致するかをスコアするために使用されます。

termおよびrange
句は、フィルタコンテキストで使用されます。 一致しない文書は除外しますが、一致する文書のスコアには影響しません。

mache all query

全てのドキュメントに一致するクエリで
スコア1.0を与える。boostで与えるスコアは変更できる。

GET /_search
{
  "query": {
  "match_all": {}
  }
}

他には、下記の分類のクエリがある。(下2つは分類でない)
Full text queries
Term level queries
Compound queries
Joining queries
Geo queries
Specialized queries
Span queries
Minimum Should Match
Multi Term Query Rewrite

query,filterの種類が多いので
よく見かけるsimple_query_stringから調査。

simple_query_string

Simple Query String Query | Elasticsearch Reference [5.1] | Elastic

query_stringとの違いは、
例外をスローしない、クエリの無効な部分は破棄されること。

GET /_search
{
  "query": {
      "simple_query_string" : {
          "query": "\"fried eggs\" +(eggplant | potato) -frittata",
          "analyzer": "snowball",
          "fields": ["body^5","_all"],
          "default_operator": "and"
      }
  }
}

基本的な項目の意味は下記の通り
"query":検索する内容
"analyzer":複合クエリを作成するときにクエリの各用語を分析するために使用するもの。(よくわからない)
"fields":検索対象とするフィールド
"default_operator":"query"に入力した内容に対してAND条件なのかOR条件なのかを指定

別の例
Elasticsearchのクエリとフィルターで簡単な検索を試す例 | EasyRamble

"query" : {
  "simple_query_string" : {
   "fields": ["name"],
   "query": "熊本 焼肉",
   "default_operator": "and"
  }
}

name フィールドを対象に「熊本 焼肉」で検索。
default_operator を and としていますので、「熊本 and 焼肉」の検索となり、
name フィールドに「熊本」と「焼肉」の両方を含む結果を返します。