概述
ES中常用的查詢類型往大了分可以分為簡單查詢,復(fù)合查詢,聚合查詢等;
而復(fù)合查詢及聚合查詢都是基于簡單查詢的;簡單查詢里面對條件的匹配方式又分為不同類型。term[s],match,match_all,match_phrase 等等
query
term
單詞查詢,在字段的倒排索引(發(fā)生分詞)或者直接在字段值(未發(fā)生分詞)中查找條件值,只要找到這個(gè)條件值就算匹配上,得分為1。
terms
多個(gè)單詞查詢,效果為 多個(gè) term 或者的邏輯。bool -> should -> term1,term2…
range
一般用于對數(shù)值類型進(jìn)行范圍查詢
match_all
無條件查詢,匹配所有數(shù)據(jù)
match
- 根據(jù)文檔中實(shí)際存儲(chǔ)的字段類型(是否為分詞文本 text,keyword 不會(huì)進(jìn)行分詞),決定是否對條件值進(jìn)行分詞
- 如果未分詞,直接以條件值執(zhí)行 term 查詢
- 如果分詞,則對條件值進(jìn)行,分詞處理;
- 若得到一個(gè)詞,也是執(zhí)行term查詢
- 若得到多個(gè)詞,默認(rèn)執(zhí)行 terms 查詢(多個(gè)單詞 或者關(guān)系)
- 也可以手動(dòng)指定為 且關(guān)系(如果為且,意思是,倒排索引后的詞表中要包含 條件分詞后的 所有單詞),通過以下方式指定 match 單詞之間的關(guān)系
以上查詢 operator 默認(rèn)為 or,分詞 得到 張 和 四 兩個(gè)詞;GET /stu/_search { "query": { "match": { "name": { "query": "張 四", "operator": "and" } } } }
可以查到 張三 李四 張三四 三個(gè)人。
我們將 operator 指定為 and 后,只能查到 張三四 一個(gè)人了,必須包含條件分詞后的所有單詞。
match 匹配精度問題
對于match 分詞后的查詢;
and 是必須包含條件分詞后所有的單詞
or 是只需包含條件分詞后任意一個(gè)單詞。
and 下相對來說精度問題還好點(diǎn),畢竟要包含所有條件分詞單詞。
如果是在or的情況,我們想要定義至少包含幾個(gè)單詞才當(dāng)作匹配上,此時(shí)還需要另一個(gè)參數(shù) minimum_should_match 。
雖然在and情況下,用得相對較少,但對and也有效
此值也可以設(shè)置為百分比,意思是條件分詞后,達(dá)到比例的條件單詞匹配上才算匹配,
比如,以下查詢語句是查不出數(shù)據(jù)的
GET /stu/_search
{
"query": {
"match": {
"name": {
"query": "張 四",
"operator": "and",
"minimum_should_match": 3
}
}
}
}
因?yàn)槟愕臈l件分詞,只有 2個(gè)詞,即使分詞也只得到2個(gè)詞, 小于 minimum_should_match
match_phrase
以當(dāng)前條件值,到文檔**字段(而非分詞后的列表)**里查詢。
條件不做分詞,到文檔字段內(nèi) 進(jìn)行連續(xù)的 文本匹配
match_pharse_prefix
同樣是以 條件不做分詞到文檔字段中查詢,但是條件最后的 單詞不是必須匹配字段內(nèi)的完整單詞
例如:
文檔字段為 i love you
條件為 i love yo
match_phrase 下 無法匹配,因?yàn)?文檔中 you 是一個(gè)完整的單詞;只能匹配 i 或者 i love 或者 i love you
match_pharse_prefix 就可以匹配,就是說只要是一個(gè)前綴包含的連續(xù)文本就能匹配
match_bool_prefix
條件進(jìn)行分詞,執(zhí)行 bool > should 查詢
前面的詞 做 term 查詢,最后一個(gè)詞做 perfix 查詢
multi_match
在實(shí)際開發(fā)中,特別是模糊查詢場景,可能需要將條件應(yīng)用到多個(gè)文檔字段上進(jìn)行匹配。
當(dāng)然我們可以使用 bool + should 的方式實(shí)現(xiàn)。
但ES已經(jīng)給我們提供了一種更為便捷的方式。
同時(shí)匹配 品牌或名稱 有蘋果的數(shù)據(jù)
"query": {
"multi_match" : {
"query": "蘋果",
"fields": [ "brand", "name" ]
}
}
等價(jià)于
"query": {
"bool": {
"should": [
{
"match": {
"brand": "蘋果"
}
},
{
"match": {
"name": "蘋果"
}
}
]
}
}
query_string
以下是引用自ES社區(qū)博客中的一段描述
該查詢使用語法基于 OR,AND 或 NOT 等運(yùn)算符來解析和拆分提供的查詢字符串。 然后查詢在返回匹配文檔之前獨(dú)立分析每個(gè)拆分文本。
你可以使用 query_string 查詢創(chuàng)建一個(gè)復(fù)雜的搜索,其中包括通配符,跨多個(gè)字段的搜索等等。 盡管用途廣泛,但查詢是嚴(yán)格的,如果查詢字符串包含任何無效語法,則返回錯(cuò)誤。
簡單總結(jié):這是使用字符串通過 AND OR NOT 構(gòu)建復(fù)雜查詢的一種實(shí)現(xiàn)方式,但是語法較嚴(yán)格,容易出錯(cuò),并不推薦在日常查詢中使用
實(shí)際測試下來,單個(gè)條件執(zhí)行的應(yīng)該是match操作
簡單查詢一個(gè)字段
default_field:條件字段,只能一個(gè)。
GET /bank/_search
{
"query": {
"query_string": {
"default_field": "address",
"query": "School Lane"
}
}
}
返回結(jié)果為 School Lane 的match查詢,凡是 address 包含 School 或者 Lane 的都匹配上
在多個(gè)字段上應(yīng)用同一個(gè)條件 (類似multi_match)
上面的簡單查詢 通過 “default_field”: “字段名” 指定一個(gè)查詢字段。
當(dāng)要將條件應(yīng)用到多個(gè)字段時(shí),可以使用 “fields”: [“字段1”, “字段2”],
GET /bank/_search
{
"query": {
"query_string": {
"fields": ["age", "account_number"],
"query": "26"
}
}
}
查詢 age match 26 或者 account_number match 26 的數(shù)據(jù)
在所有字段上應(yīng)用同一個(gè)條件 (超越了multi_match)
在所有字段上執(zhí)行match操作,只要任何一個(gè)字段匹配上就算匹配。
我們只需要去掉 fields 字段即可
GET /bank/_search
{
"query": {
"query_string": {
"query": "28"
}
},
"size": 2000
}
以上,在所有字段上應(yīng)用 match 28。
在 bank 這個(gè)索引下,查到了 age = 28 和 id = 28 的數(shù)據(jù)
對單個(gè)條件應(yīng)用多個(gè)值
多個(gè)值之間可以是 AND 或者 OR 的關(guān)系
- 在所有字段上match 28 或者 30
GET /bank/_search
{
"query": {
"query_string": {
"query": "28 OR 30"
}
},
"size": 2000
}
指定字段 fields 或默認(rèn)字段 default_field都適用這個(gè)邏輯關(guān)系
NOT 關(guān)鍵字可以用在邏輯關(guān)系中任一項(xiàng)的前面,表示查詢相反條件
query_string
上面指定字段要么使用 fields ,要么使用 default_field,其實(shí)還有另一種更為靈活的方式,我們可以直接將字段寫到 query查詢語句中,
使用 query:“字段名: 條件值” 的方式靈活定制查詢條件
match 匹配
一個(gè)字段一個(gè)值
GET /bank/_search
{
"query": {
"query_string": {
"query": "age: 30"
}
},
"size": 100
}
一個(gè)字段多個(gè)值
GET /bank/_search
{
"query": {
"query_string": {
"query": "age: 30 OR 20"
}
},
"size": 100
}
多個(gè)字段一個(gè)值
GET /bank/_search
{
"query": {
"query_string": {
"query": "age: 30 OR account_number:1"
}
},
"size": 100
}
多個(gè)字段多個(gè)值
GET /bank/_search
{
"query": {
"query_string": {
"query": "age: (30 OR 20) OR account_number: 1"
}
},
"size": 100
}
模糊匹配(比match更強(qiáng)大,在match后的詞里面再進(jìn)行模糊匹配)
如下:
match Sedgwick
GET /bank/_search
{
"query": {
"match": {
"address": "Sedgwick"
}
}
}
match 只能在分詞后的倒排索引中精確匹配
如果把條件值改成 Sedgwic,去掉最后一個(gè) k,match就查不出來數(shù)據(jù)了。
但是使用 query_string 的模糊匹配依然有辦法查出來這兩條數(shù)據(jù)
query_string 的模糊匹配有兩個(gè)通配符
- ?,統(tǒng)配一個(gè)字符,
- *,統(tǒng)配任意多個(gè)字符
使用以下語句都可以查出這兩條數(shù)據(jù) - ?匹配一個(gè)字符 k
GET /bank/_search
{
"query": {
"query_string": {
"default_field": "address",
"query": "Sedgwic?"
}
}
}
- *匹配一個(gè)字符 k
GET /bank/_search
{
"query": {
"query_string": {
"default_field": "address",
"query": "Sedgwic*"
}
}
}
- *匹配多個(gè)字符 ck
GET /bank/_search
{
"query": {
"query_string": {
"default_field": "address",
"query": "Sedgwi*"
}
}
}
- 前綴也能模糊
GET /bank/_search
{
"query": {
"query_string": {
"default_field": "address",
"query": "*dgwi*"
}
}
}
以上都能查出來那兩條數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-707014.html
范圍匹配
默認(rèn)的匹配方式為 match,其本質(zhì)就是 等值匹配,只是分不分詞的區(qū)別,
對于 query 中的 range 查詢,query_string 中也有對應(yīng)實(shí)現(xiàn)。
并且 query_string 還支持兩種寫法文章來源地址http://www.zghlxwxcb.cn/news/detail-707014.html
- 區(qū)間寫法
[ 表示包含起始值
] 表示包含結(jié)束值
{ 不包含起始值
} 不包含結(jié)束值
*表示不限制這一邊的值
以下例子- [1 TO 2] :1 <= x <= 2
- {1 TO 2} :1 < x < 2
- [* TO 2] : x <= 2
依然支持上面不同字段的寫法,這里只是舉個(gè)例子
GET /bank/_search
{
"query": {
"query_string": {
"default_field": "age",
"query": "{* TO 20]"
}
}
}
GET /bank/_search
{
"query": {
"query_string": {
"query": "age:{* TO 20]"
}
}
}
- 傳統(tǒng) > < 寫法
- “>2” 大于2
- ">=2"大于等于2
- “>=2 AND <=5” 大于等于2且小于等于5
與上面那些多條件,多個(gè)值,模糊查詢 不同維度之間 是可以混合使用的。
GET /bank/_search
{
"query": {
"query_string": {
"default_field": "age",
"query": ">=20"
}
}
}
GET /bank/_search
{
"query": {
"query_string": {
"default_field": "age",
"query": ">=20 AND <30"
}
}
}
GET /bank/_search
{
"query": {
"query_string": {
"query": "age:(>=20 AND <30)"
}
}
}
query_string 不同維度之間都是可以混用的(以上只是介紹了query_string基本用法,還有很多高級(jí)特性,具體可以參考官方文檔)
到了這里,關(guān)于Elasticsearch 基本使用(五)查詢條件匹配方式(query & query_string)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!