一 序
本文屬於極客時間Elasticsearch核心技術與實戰學習筆記系列。從本節開始,學習進入深入階段。本節主要學習基於term 的查詢與全文本查詢的區別。
二 基於term 查詢
- Term Level Query:Term Query / Range Query / Exists Query / Prefix Query / Wildcard Query
- 在 ES 中,Term 查詢,對輸入不做分詞。會將輸入作爲一個整體,在倒排索引中查找準確的詞項,並且使用相關度算分公式爲每個包含該詞項的文檔進行相關度算分 - 例如 “Apple Store”
- 可以通過 Constant Score 將查詢轉換換成一個 Filtering,避免算分,並利用緩存,提交性能
demo
插入數據
DELETE products
PUT products
{
"settings": {
"number_of_shards": 1
}
}
POST /products/_bulk
{ "index": { "_id": 1 }}
{ "productID" : "XHDK-A-1293-#fJ3","desc":"iPhone" }
{ "index": { "_id": 2 }}
{ "productID" : "KDKE-B-9947-#kL5","desc":"iPad" }
{ "index": { "_id": 3 }}
{ "productID" : "JODL-X-1937-#pV7","desc":"MBP" }
查詢: iPhone ,term 查詢不到。
改爲小寫iphone. 能查到。因爲post寫入數據的過程中,把大寫字母改爲小寫。上面term 查詢是精準查詢。
針對ID查詢:// 無結果
es對輸入做標準輸入,會拆分
//如果對值進行查詢
POST /products/_search
{
"query": {
"term": {
"productID.keyword": {
"value": "XHDK-A-1293-#fJ3"
}
}
}
}
term查詢還是會返回算分結果的。
- 將 Query 轉成 Filter,忽略 TF-IDF 計算,避免相關性算分的開銷
- Filter 可以有效利用緩存
三 基於全文本的查詢
基於全文本的查找
- Match Query / Match Phrase Query / Query String Query
特點
- 索引和搜索時會進行分詞,查詢字符串先傳遞到一個合適的分詞器,然後生成一個供查詢的詞項列表
- 查詢時候,先會對輸入的查詢進行分詞。然後每個詞項逐個進行底層的查詢,最終將結果進行合併。並未每個文檔生成一個算分。 例如查 “Martix reloaded”, 會查到包括 Matrix 或者 reload 的所有結果。
查詢過程
基於全文本的查找
- Match Query / Match Phrase Query / Query String Query
基於全文本的查詢的特點
- 索引和搜索時都會進行分詞,查詢字符串先傳遞到一個合適的分詞器,然後生成一個供查詢的詞項列表
- 查詢會對每個詞項逐個進行底層的查詢,再將結果進行合併,並未每個文檔生成一個算分
demo:
PUT groups
{
"mappings": {
"properties": {
"names":{
"type": "text",
"position_increment_gap": 0
}
}
}
}
GET groups/_mapping
POST groups/_doc
{
"names": [ "John Water", "Water Smith"]
}
POST groups/_search
{
"query": {
"match_phrase": {
"names": {
"query": "Water Water",
"slop": 100
}
}
}
}
總結