elasticsearch Query DSL(一)

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

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

Query DSL

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

  • Leaf query clauses

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

  • Compound query clauses

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

查詢子句的行爲有所不一樣,具體取決於它們是在 查詢上下文仍是過濾器上下文中使用緩存

Query和filterelasticsearch

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

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

相關文章
相關標籤/搜索