ElasticSearch基本查詢

2022-02-21 11:32:55 字數 3709 閱讀 1521

布林查詢是最常用的組合查詢,不僅將多個查詢條件組合在一起,並且將查詢的結果和結果的評分組合在一起。當查詢條件是多個表示式的組合時,布林查詢非常有用,實際上,布林查詢把多個子查詢組合(combine)成乙個布林表示式,所有子查詢之間的邏輯關係是與(and);只有當乙個文件滿足布林查詢中的所有子查詢條件時,elasticsearch引擎才認為該文件滿足查詢條件。布林查詢支援的子查詢型別共有四種,分別是:must,should,must_not和filter:

通常情況下,should子句是陣列字段,包含多個should子查詢,預設情況下,匹配的文件必須滿足其中乙個子查詢條件。

如果查詢需要改變預設匹配行為,查詢dsl必須顯式設定布林查詢的引數minimum_should_match的值,該引數控制乙個文件必須匹配的should子查詢的數量,我遇到乙個布林查詢語句,其should子句中包含兩個查詢,如果不設定引數minimum_should_match,其預設值是0。建議在布林查詢中,顯示設定引數minimum_should_match的值。

注:布林查詢的四個子句,都可以是陣列字段,因此,支援巢狀邏輯操作的查詢。

例如,對於以下should查詢,乙個文件必須滿足should子句中兩個以上的詞條查詢:

"should" : [

},},}],

"minimum_should_match" : 2

布林查詢的各個子句之間的邏輯關係是與(and),這意味著,乙個文件只有同時滿足所有的查詢子句時,該文件才匹配查詢條件,作為結果返回。

查詢和過濾上下文

在布林查詢中,查詢被分為query context 和 filter context,查詢上下文由query引數指定,過濾上下文由filter和must_not引數指定。這兩個查詢上下文的唯一區別是:filter context不影響查詢的評分(score)。在布林查詢中,filter引數和must_not引數使用filter context,而must和should使用query context,經常使用filter context,引擎會自動快取資料,提高查詢效能。

get _search

}, }

],"filter": [

}, }} ]}

}}

view code

對於上述查詢請求,must子句處於query context中,filter子句處於filter context中:

參考:elasticsearch查詢 第五篇:布林查詢

字串的完全匹配是指字元的大小寫,字元的數量和位置都是相同的,詞條(term)查詢使用字元的完全匹配方式進行文字搜尋,詞條查詢不會分析(analyze)查詢字串,給定的字段必須完全匹配詞條查詢中指定的字串。由於詞條查詢的字串是未經分析(analyzed)的詞條,因此,詞條查詢經常用於結構化的資料,例如,數值,日期等,當用於文字搜尋時,最好在索引對映中設定字串欄位不被索引,也就是說,設定index屬性為not_analyzed,否則,只能對該字段進行單詞條搜尋,也可以使用多欄位(fields)屬性,定義乙個不被分析的字段,原始字段用於全文搜尋,而多字段用於詞條搜尋:

詞條(term)查詢和全文(fulltext)查詢最大的不同之處是:

全文查詢首先分析(analyze)查詢字串,使用預設的分析器分解成一系列的分詞,term1,term2,termn,然後從索引中搜尋是否有文件包含這些分詞中的乙個或多個,如果執行的match查詢,預設的操作符(operator)是,只要文件的字段值能夠匹配任意乙個詞條,該文件就匹配查詢條件;而詞條查詢是字元的完全匹配,只有當字段的字元完全匹配【包括大小寫】查詢字串時,elasticsearch引擎才判定文件匹配查詢條件:

詞條查詢:詞條查詢不會分析查詢條件,只有當詞條和查詢字串完全匹配時,才匹配搜尋。當在未被分析的字段中進行搜尋時,和查詢字串完全匹配的文件會被返回;如果在已分析(analyzed)的字段中進行搜尋,詞條必須是小寫的單個詞條,否則,匹配不到任何文件;

全文查詢:elasticsearch引擎會先分析(analyze)查詢字串,將其拆分成小寫的分詞,只要已分析的字段中包含詞條的任意乙個,或全部包含,就匹配查詢條件,返回該文件;如果不包含任意乙個分詞,表示沒有任何文件匹配查詢條件。

put my_index

, "exact_value": }}

}}put my_index/my_type/1

view code

欄位full_text 預設值被分析的(analyzed),欄位exact_value顯式設定不被分析,索引文件的結果是:在倒排索引中,欄位full_text包含兩個分詞:quick和foxes,分詞都是小寫的;而exact_value由於未被分析,只是整個短語「quick foxes!」,只能進行完全匹配,在查詢條件中,少乙個字元或多乙個字元,甚至大小寫不同都不能匹配。

elsticsearch支援的萬用字元(wildcard)有2個,分別是:

在萬用字元查詢中,elasticsearch引擎不會分析查詢字串,當文件的字段 匹配萬用字元查詢條件時,文件匹配。萬用字元查詢會使查詢效能變差,為了提高查詢效能,推薦:查詢字串不要以萬用字元開頭,只在查詢字串中間或末尾使用萬用字元。

}}

字首匹配查詢是指,文件的字段包含 以指定的字元(不會被分析)為字首的分詞,字首匹配適用於已分析字段,只能匹配單個分詞的字首;

也適用於未被分析的字段,這樣,字串將從原始值的第乙個字元開始字首匹配

}}

查詢指定字段 包含與指定術語模糊相似的術語的文件。模糊度是以levenshtein編輯距離1或2來衡量的。

引數:fuzziness,你的搜尋文字最多可以糾正幾個字母去跟你的資料進行匹配,預設如果不設定,就是2

引數:min_similarity是查詢字串與資料庫中的字串匹配的百分比。

引數:max_expansions是levenshtein距離,通過該距離搜尋應該執行。預設50。

查詢指定字段包含指定範圍內的值(日期,數字或字串)的文件。

}

}

範圍查詢使用的比較操作符:

missing 過濾可以用於查詢文件中 沒有某個欄位的文件

總共有3個文件,查詢一下就剩2個,實際的查詢是轉換為must_not

參考:elasticsearch查詢 第三篇:詞條查詢

Elasticsearch 基本操作

mget elasticsearch中檢索多個文件,相對於乙個乙個的檢索,更快的方式是在乙個請求中使用multi get或者 mget api。具體應用如下 mget api引數是乙個 docs 陣列,陣列的每個節點定義乙個文件的 index type id 元資料。如果你只想檢索乙個或幾 個確定的...

elasticsearch基本操作

get search 建立索引 指定分片和副本 put lib 建立索引 put lib2 檢視索引的配置 get lib settings get lib2 settings get all settings 新增文件put方式指定id put lib user 1 新增文件,不指定id用post...

Elasticsearch 基本操作

乙個批量匯入elasticsearch 的demo 機器少的話,分片數最好是你的data節點的機器數倍數,這樣請求負載能夠均攤到每個機器上,如果機器比較多,最好保證分片數不要太多,比如最好別超過20 30個,然後根據你的資料量評估一下,盡量保證每個分片在15到20g吧 資料 vi request.j...