ES elasticsearch 查詢或搜尋總結

2021-10-08 09:58:23 字數 4174 閱讀 4153

很多寫說明文件,沒有總結寫開頭。因為文件內容又很多,你看到後面就忘記前面,沒有形成結構化知識。這樣知識在大腦裡是離散的,不完整,不準確的。

所以我的文章都是把結論寫最開始,或者要說的全部內容用一句話寫在最開始。你知道了可以不用看,不知道,可以一眼知道接下來學到什麼。

當你看到後面,不記得前面了,回到最開始一句話,大腦就會統領全域性,形成最準確和系統性的知識。

我們只能按大腦習慣的學習知識,不可違背大腦的習慣學習,不然只會事倍功半,甚至於學過就忘。

query context 查詢上下文這種語句在執行時既要計算文件是否匹配,還要計算文件相對於其他文件的匹配度有多高,匹配度越高,_score分數就越高

filter context 過濾上下文過濾上下文中的語句在執行時只關心文件是否和查詢匹配,不會計算匹配度,也就是得分

也就是你寫dsl(es 查詢語法語言)語句時,可以用的下一級字段例如 }}

match query: 知道分詞器的存在,會對filed進行分詞操作,然後再查詢

match_all: 查詢所有文件

multi_match: 可以指定多個字段

match_phrase: 短語匹配查詢,elasticsearch引擎首先分析(analyze)查詢字串,從分析後的文字中構建短語查詢,這意味著必須匹配短語中的所有分詞。

#1、 查詢年齡為3的(命中:id = 1)

get student/_search

}}#2、查詢興趣裡包含'演戲'的 (命中 id = 2,5,4)

get student/_search

}}#這裡只要interests包含'演戲','演','戲'的都會命中

#3、查詢索引所有文件 (命中 id = 1,2,3,4,5)

get student/_search

}}#4、查詢name和address包含'德' (命中 id = 2)

get student/_search

}}#說明 這裡文件id為4的address為'德州',應該也包含'德',但卻沒有被命中,原因是我們索引結構中,address屬性是乙個keyword型別,它是需要完全匹配,而不是包含的關係。

#如果這裡query為'德州'就可以命中2條資料。

#5、查詢興趣裡包含'演員'的 (命中 無)

get student/_search

}}# 這裡和match的區別是這裡是真正包含'演員',而不是只要滿足其中乙個字就會被模糊命中

term query: 會去倒排索引中尋找確切的term,它並不知道分詞器的存在。這種查詢適合keyword 、numeric、date

get student/_search

}}#如果僅檢索'香'那是無法命中的,因為keyword需要完全匹配才能命中

#2、查詢位址等於"香港"或"北京"的 (命中: id =2,3,5)

get student/_search

}}range: 實現範圍查詢

include_lower: 是否包含範圍的左邊界,預設是true

include_upper: 是否包含範圍的右邊界,預設是true

#2、查詢年紀18到28 (命中 id = 2,3)

get student/_search}}

}

允許使用萬用字元* 和 ?來進行查詢

*代表0個或多個字元

?代表任意乙個字元

#1、查詢姓名'徐'開頭的 (命中 id = 1)

get student/_search

}}

模糊查詢可以在match和 multi-match查詢中使用以便解決拼寫的錯誤,模糊度是基於levenshteindistance計算與原單詞的距離。使用如下:

get student/_search}}

}

filter是不計算相關性的,同時可以cache。因此,filter速度要快於query

#1、獲取年齡為3的 (命中 id = 1)

get student/_search

}}#2、查詢年紀為3或者63的 (命中 id = 1,4)

get student/_search

}}

bool query(布林查詢)、boosting query(提高查詢)、constant_score(固定分數查詢)、dis_max(最佳匹配查詢)、function_score(函式查詢)

1.布林查詢 "query":"bool"

# must:    必須匹配。貢獻算分

# must_not:過濾子句,必須不能匹配,但不貢獻算分

# should: 選擇性匹配,至少滿足一條。貢獻算分

# filter: 過濾子句,必須匹配,但不貢獻算分 在filter元素下指定的查詢對評分沒有影響 , 評分 返回為0。分數僅受已指定查詢的影響。

post _search

},"filter":

},"must_not" : }},

"should" : [},}

],"minimum_should_match" : 1,

"boost" : 1.0

}}}

在上面的復合查詢我們可以通過must_not+must先剔除不想匹配的文件,再獲取匹配的文件,但是有一種場景就是我並不需要完全剔除,而是把需要剔除的那部分文件的分數降低。

# 通過boosting的方式,將3的記錄也納入結果集,只是排名會靠後。(結果 1->2->3)

post news/_search

},"negative":

},"negative_boost": 0.5}}}

"""說明boosting需要搭配三個關鍵字 positive , negative , negative_boost

只有匹配了 positive查詢 的文件才會被包含到結果集中,但是同時匹配了negative查詢 的文件會被降低其相關度,通過將文件原本的_score和negative_boost引數進行

相乘來得到新的_score。因此,negative_boost引數一般小於1.0。在上面的例子中,任何包含了指定負面詞條的文件的_score都會是其原本_score的一半。

"""

就是說就算文件包含了蘋果,但因為包含了樹或者水果那麼我們也會過濾這條文件資訊,因為我們要查的蘋果公司相關資訊,如果你是蘋果樹那對我來講確實是不匹配,

所以直接過濾掉,看是沒啥問題。

但是你想,這樣做是不是太粗暴了,因為乙個文件中包含'蘋果'和'樹'那不代表一定是蘋果樹,而可能是 '蘋果公司組織員工一起去種樹' 那麼這條文件理應出現

而不是直接過濾掉,所以我們就可以用boosting query。就像上面這個例子一樣。

dis_max: 只是取分數最高的那個query的分數而已。

get /_search

}, }

],"tie_breaker" : 0.7}}

}"""

假設一條文件的'title'查詢得分是 1,'body'查詢得分是1.6。那麼總得分為:1.6+1*0.7 = 2.3。

如果我們去掉"tie_breaker" : 0.7 ,那麼tie_breaker預設為0,那麼這條文件的得分就是 1.6 + 1*0 = 1.6

"""

向量搜尋的計算余弦相似度,就可以用到

},

},}],

"filter": }}},

"script": }}

}}

linux查詢 搜尋字元或檔案

linux下查詢 搜尋相關 規則 pattern 向下查詢pattern匹配字串 pattern 向上查詢pattern匹配字串使用了查詢命令之後,使用如下兩個鍵快速查詢 n 按照同一方向繼續查詢 n 按照反方向查詢 查詢匹配的字串 pattern是需要匹配的字串,例如 abc 查詢abc除此之外,...

搜尋檔案或目錄

which 檢視可執行檔案的位置 例如 which passwd whereis 檢視檔案的位置 b 只找二進位制檔案 m 只找在說明檔案manual路徑下的檔案 s 只找source原始檔 u 沒有說明文件的檔案 從資料庫中查詢 locate 配合資料庫檢視檔案位置 使用locate查詢資料特別快...

Linux搜尋檔案或內容

1 遞迴搜尋檔案內容,如果查詢 hello,world 字串,可以這樣 grep rn hello,world 表示當前目錄所有檔案,也可以是某個檔名 r 是遞迴查詢 n 是顯示行號 r 查詢所有檔案包含子目錄 i 忽略大小寫 2 搜尋檔案 find name pay.html 表示根目錄,也可以自...