1. 程式人生 > >elasticsearch Query DSL(一)

elasticsearch Query DSL(一)

本文參考官方提供api提煉出來的

https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html

Query DSL

Elasticsearch提供基於JSON的完整查詢DSL(域特定語言)來定義查詢。將Query DSL視為查詢的AST(抽象語法樹),由兩種型別的子句組成:

  • Leaf query clauses

葉查詢子句中尋找一個特定的值在某一特定領域,如 matchtermrange查詢。這些查詢可以單獨使用。

  • Compound query clauses

複合查詢子句包裝其他葉子複合查詢,用於以邏輯方式(例如booldis_max查詢)組合多個查詢 ,或者更改其行為(例如 constant_score查詢)。

查詢子句的行為有所不同,具體取決於它們是在 查詢上下文還是過濾器上下文中使用

Query和filter

query子句的行為取決於它是在查詢上下文中還是在過濾器上下文中使用:

query

查詢上下文中使用的查詢子句回答了問題“ 此文件與此查詢子句的匹配程度如何?“除了判斷文件是否匹配之外,查詢子句還計算_score表示文件相對於其他文件的匹配程度。

查詢上下文是有效每當查詢子句被傳遞給一個query引數,如query該引數search的API。

filter

在過濾器上下文中,查詢子句回答問題“ 此文件是否與此查詢子句匹配?“答案是簡單的是或否 - 沒有計算得分。過濾器上下文主要用於過濾結構化資料,例如

  • 這是否timestamp屬於2015年至2016年的範圍?
  • 在status 欄位設定為"published"?

Elasticsearch會自動快取經常使用的過濾器,以加快效能

只要將查詢子句傳遞給filter 引數(例如查詢中的filter或mustnot引數, bool查詢中的filter引數 constantscore或filter聚合), 過濾器上下文就會生效。

GET / _search
 { “query” :{
    “bool” :{
      “必須” :[ { “匹配” :{ “title” :“搜尋” }},
        { “match” :{ “content” :“Elasticsearch” }}
      ],“過濾器” :[
        { “term” :{ “status” :“已釋出” }},
        { “range” :{ “publish_date” :{ “gte” :“2015-01-01” }}}
      ] } } }

Match All

最簡單的查詢,匹配所有文件,給他們所有_score 的1.0。

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

match_none

這是match_all查詢的反轉,它不匹配任何文件。

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

Full text queries

高階全文查詢通常用於在全文欄位(如電子郵件正文)上執行全文查詢。他們瞭解如何分析被查詢的欄位,並在執行之前將每個欄位 analyzer(或search_analyzer)應用於查詢字串。

Match

用於執行全文查詢的標準查詢,包括模糊匹配和短語或鄰近查詢。

GET /_search
{
    "query": {
        "match" : {
            "message" : "this is a test"
        }
    }
}

Match查詢型別為boolean。這意味著文字是可分析的,分析過程根據提供的文字構造布林查詢。該operator標誌可以設定為or或and用來控制布林子句(預設為or)。should可以使用minimumshouldmatch 引數設定要匹配的最小可選子句數。如果要檢索的field,是not_analyzed型別的,那麼match query也相當於term query。

所述analyzer可以被設定為控制哪個分析器將在文字上執行的分析過程。它預設為欄位顯式對映定義或預設搜尋分析器。

該lenient引數可以設定為true忽略造成的資料型別不匹配的異常,如想查詢的數字欄位與文字查詢字串。預設為false。

Fuzziness

fuzziness允許基於被查詢的欄位型別進行模糊匹配。

prefixlength和maxexpansions可以在這種情況下,以控制模糊處理來設定。如果設定了模糊選項,則查詢將使用toptermsblendedfreqs${maxexpansions} 其重寫方法,該fuzzyrewrite引數允許控制如何重寫查詢。

預設情況下允許模糊轉置(ab→ ba),但可以通過設定fuzzy_transpositions為禁用false。

GET /_search
{
    "query": {
        "match" : {
            "message" : {
                "query" : "this is a test",
                "operator" : "and"
            }
        }
    }
}

Zero terms query

如果使用的分析器刪除了像stop過濾器那樣的查詢中的所有標記,則預設行為是根本不匹配任何文件。為了更改zerotermsquery可以使用的選項,它接受 none(預設)並且all對應於match_all查詢。

GET /_search
{
    "query": {
        "match" : {
            "message" : {
                "query" : "to be or not to be",
                "operator" : "and",
                "zero_terms_query": "all"
            }
        }
    }
}

Cutoff frequency

匹配查詢支援cutoff_frequency允許指定絕對或相對文件頻率,其中高頻項被移動到可選子查詢中,並且僅在or運算子或所有子項中的低頻率(低於截止值)項之一時進行評分 。在and 運營商匹配的情況下的低頻項。

此查詢允許stopwords在執行時動態處理,與域無關,並且不需要停用檔案。它可以防止評分/迭代高頻術語,並且只有在更重要/更低頻率的術語與文件匹配時才考慮這些術語。然而,如果所有查詢項都高於給定cutoff_frequency的查詢,則會自動將查詢轉換為純的conj(and)查詢以確保快速執行。

GET /_search
{
    "query": {
        "match" : {
            "message" : {
                "query" : "to be or not to be",
                "cutoff_frequency" : 0.001
            }
        }
    }
}

Synonyms

match查詢支援使用synonym_graph標記過濾器進行多項同義詞擴充套件。使用此過濾器時,解析器會為每個多項同義詞建立一個短語查詢。以下同義詞:"ny, new york" would produce:(ny OR ("new york"))

GET /_search
{
   "query": {
       "match" : {
           "message": {
               "query" : "ny city",
               "auto_generate_synonyms_phrase_query" : false
           }
       }
   }
}

 

Match phrase

與match查詢類似,但用於匹配精確短語或單詞鄰近匹配。match_phrase查詢分析文字,並建立一個phrase查詢出來的分析文字。短語查詢slop以任何順序匹配最多可配置(預設為0)的術語。轉置條款的斜率為2。

analyzer可以被設定為控制哪個分析器將在文字上執行的分析過程。它預設為欄位顯式對映定義或預設搜尋分析器。

GET /_search
{
    "query": {
        "match_phrase" : {
            "message" : {
                "query" : "this is a test",
                "analyzer" : "my_analyzer"
            }
        }
    }
}

Match Phrase Prefix

像match_phrase查詢一樣,但是在最後一個單詞上進行萬用字元搜尋。

它還接受一個max_expansions引數(預設值50),該引數可以控制最後一個術語將被擴充套件的字尾數量。強烈建議將其設定為可接受的值以控制查詢的執行時間。

GET /_search
{
    "query": {
        "match_phrase_prefix" : {
            "message" : {
                "query" : "quick brown f",
                "max_expansions" : 10
            }
        }
    }
}

Multi match

multi_match查詢基礎上的match查詢 ,允許多領域的查詢。

GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ]
    }
  }
}

如果未fields提供,則multimatch查詢預設為index.query.defaultfield 索引設定,而索引設定預設為提取對映中符合術語查詢條件的所有欄位,並過濾元資料欄位。然後組合所有提取的欄位以構建查詢。

multi_match查詢在內部執行的方式取決於type 引數,該引數可以設定為:

best_fields

預設)查詢與任何欄位匹配的文件,但使用 _score最佳欄位。見best_fields

most_fields

查詢與任何欄位匹配的文件,並組合_score每個欄位。見most_fields

cross_fields

對待欄位與analyzer它們是一個大欄位一樣。在任何 欄位中查詢每個單詞。見cross_fields

phrase

match_phrase對每個欄位 執行查詢並使用 _score 最佳欄位。見phrasephrase_prefix

phrase_prefix

match_phrase_prefix對每個欄位 執行查詢並組合_score每個欄位。見phrasephrase_prefix

Common Terms Query

common terms query將所述查詢術語分為兩組:更重要(即低頻率而言)和不太重要的(即,高頻率而言這將先前已停用詞)。

首先,它搜尋與更重要的術語匹配的文件。這些術語出現在較少的文件中,對相關性有較大影響。

然後,它對不太重要的術語執行第二次查詢 - 這些術語經常出現並且對相關性的影響很小。但是,它不是計算所有匹配文件的相關性分數,而是僅計算_score已經與第一個查詢匹配的文件。通過這種方式,高頻項可以改善相關性計算,而無需支付效能不佳的成本。

如果查詢僅包含高頻術語,則單個查詢將作為AND(連線)查詢執行,換句話說,所有術語都是必需的。即使每個單獨的術語與許多文件匹配,術語組合也會將結果集縮小到最相關的範圍。單個查詢也可以作為OR特定的 查詢執行minimum_should_match,在這種情況下,應該使用足夠高的值。

根據條件將術語分配給高頻或低頻組 cutoff_frequency,可以將其指定為絕對頻率(>=1)或相對頻率(0.0 .. 1.0)。(請記住,文件頻率是按照每個分片級別計算的,如部落格文章中所述, 相關性已被破壞。)

也許這個查詢最有趣的屬性是它自動適應域特定的停用詞。例如,在視訊託管網站上,常見的術語如"clip""video"將自動錶現為停用詞而無需維護手動列表。

GET /_search
{
    "query": {
        "common": {
            "body": {
                "query": "nelly the elephant as a cartoon",
                "cutoff_frequency": 0.001,
                "low_freq_operator": "and"
            }
        }
    }
}

等價

GET /_search
{
    "query": {
        "bool": {
            "must": [
            { "term": { "body": "nelly"}},
            { "term": { "body": "elephant"}},
            { "term": { "body": "cartoon"}}
            ],
            "should": [
            { "term": { "body": "the"}},
            { "term": { "body": "as"}},
            { "term": { "body": "a"}}
            ]
        }
    }
}

Query String Query

支援緊湊的Lucene 查詢字串語法,允許您在單個查詢字串中指定AND | OR | NOT條件和多欄位搜尋。僅限專家使用者。

GET /_search
{
    "query": {
        "query_string" : {
            "default_field" : "content",
            "query" : "this AND that OR thus"
        }
    }
}

query_string高層引數包括:

引數 描述

query

要解析的實際查詢。參見查詢字串語法

default_field

如果未指定字首欄位,則查詢字詞的預設欄位。預設為index.query.default_field索引設定,而索引設定預設為*。 *提取對映中符合術語查詢條件的所有欄位,並過濾元資料欄位。然後組合所有提取的欄位以在沒有提供字首欄位時構建查詢。

default_operator

如果未指定顯式運算子,則使用預設運算子。例如,使用預設運算子OR,查詢 capital of Hungary將轉換為capital OR of OR Hungary,並且使用預設運算子AND,將相同的查詢轉換為 capital AND of AND Hungary。預設值為OR

analyzer

用於分析查詢字串的分析器名稱。

quote_analyzer

分析器的名稱,用於分析查詢字串中的引用短語。對於這些部件,它將覆蓋使用analyzer引數或search_quote_analyzer設定設定的其他分析器。

allow_leading_wildcard

設定時,*?允許作為第一個字元。預設為true

enable_position_increments

設定為true在結果查詢中啟用位置增量。預設為true

fuzzy_max_expansions

控制模糊查詢將擴充套件到的術語數。預設為50

fuzziness

設定模糊查詢的模糊性。預設為AUTO。請參閱允許設定的模糊性編輯

fuzzy_prefix_length

設定模糊查詢的字首長度。預設是0

fuzzy_transpositions

設定為false禁用模糊轉置(ab→ ba)。預設是true

phrase_slop

設定短語的預設斜率。如果為零,則需要精確的短語匹配。預設值是0

boost

設定查詢的提升值。預設為1.0

auto_generate_phrase_queries

預設為false

analyze_wildcard

預設情況下,不分析查詢字串中的萬用字元。通過將此值設定為true,將盡最大努力分析這些值。

max_determinized_states

限制允許建立的regexp查詢的自動機狀態數。這可以防止太難(例如指數級硬)的regexp。預設為10000。

minimum_should_match

一個值,用於控制生成的布林查詢中應該匹配的“should”子句的數量。它可以是絕對值(2),百分比(30%)或兩者組合

lenient

如果設定為true將導致基於格式的失敗(如向數字欄位提供文字)將被忽略。

time_zone

時區應用於與日期相關的任何範圍查詢。另見 JODA時區

quote_field_suffix

附加到查詢字串的引用部分的欄位的字尾。這允許使用具有不同分析鏈的欄位進行精確匹配。看看這裡為一個完整的例子。

auto_generate_synonyms_phrase_query

是否應為多項同義詞自動生成短語查詢。預設為true

all_fields

6.0.0 ] 在6.0.0中已棄用。設定default_field*代替執行上可以查詢對映檢測到的所有欄位的查詢。_all禁用該欄位時將預設使用,並且未default_field指定no (在索引設定或請求正文中)並且未fields指定no 。

Simple Query String Query

一種更簡單,更健壯的query_string語法版本,適合直接向用戶公開。

使用SimpleQueryParser解析其上下文的查詢。與常規query_string查詢不同,simple_query_string查詢永遠不會丟擲異常,並丟棄查詢的無效部分

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

simple_query_string高層引數包括:

引數 描述

query

要解析的實際查詢。請參閱下面的語法。

fields

要執行解析查詢的欄位。預設為index.query.default_field索引設定,而索引設定預設為*。 *提取對映中符合術語查詢條件的所有欄位,並過濾元資料欄位。

default_operator

如果未指定顯式運算子,則使用預設運算子。例如,使用預設運算子OR,查詢 capital of Hungary將轉換為capital OR of OR Hungary,並且使用預設運算子AND,將相同的查詢轉換為 capital AND of AND Hungary。預設值為OR

analyzer

在建立複合查詢時,強制分析器用於分析查詢的每個術語。

flags

標誌指定simple_query_string要啟用的功能。預設為ALL

analyze_wildcard

是否應自動分析字首查詢的條款。如果true盡最大努力分析字首。但是,某些分析器無法僅根據術語的字首提供有意義的結果。預設為false

lenient

如果設定為true將導致基於格式的失敗(如向數字欄位提供文字)將被忽略。

minimum_should_match

要返回的文件必須匹配的最小子句數。有關minimum_should_match選項的完整列表,請參閱 文件。

quote_field_suffix

附加到查詢字串的引用部分的欄位的字尾。這允許使用具有不同分析鏈的欄位進行精確匹配。看看這裡為一個完整的例子。

auto_generate_synonyms_phrase_query

是否應為多項同義詞自動生成短語查詢。預設為true

all_fields

6.0.0 ] 在6.0.0中已棄用。設定default_field*代替執行上可以查詢對映檢測到的所有欄位的查詢。_all禁用該欄位時將預設使用,並且未default_field指定no (在索引設定或請求正文中)並且未fields指定no 。

fuzzy_prefix_length

設定模糊查詢的字首長度。預設是0

fuzzy_max_expansions

控制模糊查詢將擴充套件到的術語數。預設為50

fuzzy_transpositions

設定為false禁用模糊轉置(ab→ ba)。預設是true