鍍金池/ 教程/ Java/ 查找準(zhǔn)確值
創(chuàng)建索引
文檔局部更新
映射
查詢與過濾條件的合并
取回階段
查詢地理形狀
相關(guān)性簡介
動(dòng)態(tài)索引
處理沖突
geohash單元聚合器
主分片和復(fù)制分片如何交互
自定義分析器
下一步
過濾順序
空集群
數(shù)據(jù)吞吐
地理坐標(biāo)點(diǎn)
嵌套-映射
動(dòng)態(tài)映射
在查詢中使用已索引的形狀
局部更新文檔
包含,而不是相等
范圍
檢索文檔
映射及分析
結(jié)語
結(jié)構(gòu)化查詢 Query DSL
驗(yàn)證查詢
查找準(zhǔn)確值
Geohashes
結(jié)構(gòu)化搜索
復(fù)合核心字段類型
嵌套-集合
與Elasticsearch交互
請求體查詢
自定義動(dòng)態(tài)索引
簡易搜索
索引一個(gè)文檔
地理形狀
緩存地理位置過濾器
多文檔模式
  • 1.
分布式搜索的執(zhí)行方式
安裝Elasticsearch
地理位置聚合
分析和分析器
元數(shù)據(jù):_all 字段
地理坐標(biāo)盒模型過濾器
類型和映射
合并段
查詢多個(gè)準(zhǔn)確值
嵌套-查詢
  • 1.
為什么是奇怪的格式?
Geohashes 映射
關(guān)于緩存
開始第一步
為了搜索,你懂的
分布式的特性
添加索引
確切值(Exact values) vs. 全文文本(Full text)
掃描和滾屏
相關(guān)性排序
教程小結(jié)
數(shù)據(jù)字段
增加故障轉(zhuǎn)移
按距離排序
索引管理
分布式文檔存儲(chǔ)
geohash單元過濾器
嵌套排序
檢索多個(gè)文檔
新建、索引和刪除文檔
Geohashes
檢索文檔
減少內(nèi)存占用
重新索引數(shù)據(jù)
檢索文檔
按距離聚合
什么是文檔?
繼續(xù)擴(kuò)展
集群健康
入門
映射(mapping)
近實(shí)時(shí)搜索
地理形狀的過濾與緩存
集群內(nèi)部工作方式
應(yīng)對故障
范圍(邊界)聚合器
分析
分頁
刪除文檔
倒排索引
索引地理形狀
嵌套-對象
  • 1.
橫向擴(kuò)展
查詢階段
元數(shù)據(jù):_source 字段
多索引和多類別
路由文檔到分片
索引設(shè)置
williamzhao
多值字段字符串排序
創(chuàng)建一個(gè)新文檔
配置分析器
地理形狀
更新整個(gè)文檔
面向文檔
處理 Null 值
映射地理形狀
使文本可以被搜索
索引別名和零停機(jī)時(shí)間
通過地理坐標(biāo)點(diǎn)過濾
地理距離過濾器
搜索——基本的工具
空搜索
搜索選項(xiàng)
更新時(shí)的批量操作
最重要的查詢過濾語句
結(jié)語
組合過濾
地理位置聚合
根對象
默認(rèn)映射
文檔 ID
持久化變更
檢查文檔是否存在
入門
地理坐標(biāo)點(diǎn)

查找準(zhǔn)確值

查找準(zhǔn)確值

對于準(zhǔn)確值,你需要使用過濾器。過濾器的重要性在于它們非常的快。它們不計(jì)算相關(guān)性(避過所有計(jì)分階段)而且很容易被緩存。我們今后再來討論過濾器的性能優(yōu)勢【過濾器緩存】,現(xiàn)在,請先記住盡可能多的使用過濾器。

用于數(shù)字的 term 過濾器

我們下面將介紹 term 過濾器,首先因?yàn)槟憧赡芙?jīng)常會(huì)用到它,這個(gè)過濾器旨在處理數(shù)字,布爾值,日期,和文本。

我們來看一下例子,一些產(chǎn)品最初用數(shù)字來索引,包含兩個(gè)字段 priceproductID

POST /my_store/products/_bulk
{ "index": { "_id": 1 }}
{ "price" : 10, "productID" : "XHDK-A-1293-#fJ3" }
{ "index": { "_id": 2 }}
{ "price" : 20, "productID" : "KDKE-B-9947-#kL5" }
{ "index": { "_id": 3 }}
{ "price" : 30, "productID" : "JODL-X-1937-#pV7" }
{ "index": { "_id": 4 }}
{ "price" : 30, "productID" : "QQPX-R-3956-#aD8" }

我們的目標(biāo)是找出特定價(jià)格的產(chǎn)品。假如你有關(guān)系型數(shù)據(jù)庫背景,可能用 SQL 來表現(xiàn)這次查詢比較熟悉,它看起來像這樣:

SELECT document
FROM   products
WHERE  price = 20

在 Elasticsearch DSL 中,我們使用 term 過濾器來實(shí)現(xiàn)同樣的事。term 過濾器會(huì)查找我們設(shè)定的準(zhǔn)確值。term 過濾器本身很簡單,它接受一個(gè)字段名和我們希望查找的值:

{
    "term" : {
        "price" : 20
    }
}

term 過濾器本身并不能起作用。像在【查詢 DSL】中介紹的一樣,搜索 API 需要得到一個(gè)查詢語句,而不是一個(gè) 過濾器。為了使用 term 過濾器,我們需要將它包含在一個(gè)過濾查詢語句中:

GET /my_store/products/_search
{
    "query" : {
        "filtered" : { <1>
            "query" : {
                "match_all" : {} <2>
            },
            "filter" : {
                "term" : { <3>
                    "price" : 20
                }
            }
        }
    }
}

`filtered` 查詢同時(shí)接受 `query` 與 `filter`。 `match_all` 用來匹配所有文檔,這是默認(rèn)行為,所以在以后的例子中我們將省略掉 `query` 部分。 這是我們上面見過的 `term` 過濾器。注意它在 `filter` 分句中的位置。 執(zhí)行之后,你將得到預(yù)期的搜索結(jié)果:只能文檔 2 被返回了(因?yàn)橹挥?`2` 的價(jià)格是 `20`): ```json "hits" : [ { "_index" : "my_store", "_type" : "products", "_id" : "2", "_score" : 1.0, "_source" : { "price" : 20, "productID" : "KDKE-B-9947-#kL5" } } ] ``` 過濾器不會(huì)執(zhí)行計(jì)分和計(jì)算相關(guān)性。分值由 `match_all` 查詢產(chǎn)生,所有文檔一視同仁,所有每個(gè)結(jié)果的分值都是 `1` #### 用于文本的 `term` 過濾器 像我們在開頭提到的,`term` 過濾器可以像匹配數(shù)字一樣輕松的匹配字符串。讓我們通過特定 UPC 標(biāo)識(shí)碼來找出產(chǎn)品,而不是通過價(jià)格。如果用 SQL 來實(shí)現(xiàn),我們可能會(huì)使用下面的查詢: ```sql SELECT product FROM products WHERE productID = "XHDK-A-1293-#fJ3" ``` 轉(zhuǎn)到查詢 DSL,我們用 `term` 過濾器來構(gòu)造一個(gè)類似的查詢: ```json GET /my_store/products/_search { "query" : { "filtered" : { "filter" : { "term" : { "productID" : "XHDK-A-1293-#fJ3" } } } } } ``` 有點(diǎn)出乎意料:我們沒有得到任何結(jié)果值!為什么呢?問題不在于 `term` 查詢;而在于數(shù)據(jù)被索引的方式。如果我們使用 `analyze` API,我們可以看到 UPC 被分解成短小的表征: ```json GET /my_store/_analyze?field=productID XHDK-A-1293-#fJ3 ``` ```json { "tokens" : [ { "token" : "xhdk", "start_offset" : 0, "end_offset" : 4, "type" : "", "position" : 1 }, { "token" : "a", "start_offset" : 5, "end_offset" : 6, "type" : "", "position" : 2 }, { "token" : "1293", "start_offset" : 7, "end_offset" : 11, "type" : "", "position" : 3 }, { "token" : "fj3", "start_offset" : 13, "end_offset" : 16, "type" : "", "position" : 4 } ] } ``` 這里有一些要點(diǎn): * 我們得到了四個(gè)分開的標(biāo)記,而不是一個(gè)完整的標(biāo)記來表示 UPC。 * 所有的字符都被轉(zhuǎn)為了小寫。 * 我們失去了連字符和 `#` 符號(hào)。 所以當(dāng)我們用 `XHDK-A-1293-#fJ3` 來查找時(shí),得不到任何結(jié)果,因?yàn)檫@個(gè)標(biāo)記不在我們的倒排索引中。相反,那里有上面列出的四個(gè)標(biāo)記。 顯然,在處理唯一標(biāo)識(shí)碼,或其他枚舉值時(shí),這不是我們想要的結(jié)果。 為了避免這種情況發(fā)生,我們需要通過設(shè)置這個(gè)字段為 `not_analyzed` 來告訴 Elasticsearch 它包含一個(gè)準(zhǔn)確值。我們曾在【自定義字段映射】中見過它。為了實(shí)現(xiàn)目標(biāo),我們要先刪除舊索引(因?yàn)樗隋e(cuò)誤的映射),并創(chuàng)建一個(gè)正確映射的索引: ```json DELETE /my_store PUT /my_store { "mappings" : { "products" : { "properties" : { "productID" : { "type" : "string", "index" : "not_analyzed" } } } } } ``` 必須首先刪除索引,因?yàn)槲覀儾荒苄薷囊呀?jīng)存在的映射。 刪除后,我們可以用自定義的映射來創(chuàng)建它。 這里我們明確表示不希望 `productID` 被分析。 現(xiàn)在我們可以繼續(xù)重新索引文檔: ```json POST /my_store/products/_bulk { "index": { "_id": 1 }} { "price" : 10, "productID" : "XHDK-A-1293-#fJ3" } { "index": { "_id": 2 }} { "price" : 20, "productID" : "KDKE-B-9947-#kL5" } { "index": { "_id": 3 }} { "price" : 30, "productID" : "JODL-X-1937-#pV7" } { "index": { "_id": 4 }} { "price" : 30, "productID" : "QQPX-R-3956-#aD8" } ``` 現(xiàn)在我們的 `term` 過濾器將按預(yù)期工作。讓我們在新索引的數(shù)據(jù)上再試一次(注意,查詢和過濾都沒有修改,只是數(shù)據(jù)被重新映射了)。 ```json GET /my_store/products/_search { "query" : { "filtered" : { "filter" : { "term" : { "productID" : "XHDK-A-1293-#fJ3" } } } } } ``` `productID` 字段沒有經(jīng)過分析,`term` 過濾器也沒有執(zhí)行分析,所以這條查詢找到了準(zhǔn)確匹配的值,如期返回了文檔 1。 #### 內(nèi)部過濾操作 Elasticsearch 在內(nèi)部會(huì)通過一些操作來執(zhí)行一次過濾: 1. _查找匹配文檔_。 `term` 過濾器在倒排索引中查找詞 `XHDK-A-1293-#fJ3`,然后返回包含那個(gè)詞的文檔列表。在這個(gè)例子中,只有文檔 1 有我們想要的詞。 2. _創(chuàng)建字節(jié)集_ 然后過濾器將創(chuàng)建一個(gè) _字節(jié)集_ —— 一個(gè)由 1 和 0 組成的數(shù)組 —— 描述哪些文檔包含這個(gè)詞。匹配的文檔得到 `1` 字節(jié),在我們的例子中,字節(jié)集將是 `[1,0,0,0]` 3. _緩存字節(jié)集_ 最后,字節(jié)集被儲(chǔ)存在內(nèi)存中,以使我們能用它來跳過步驟 1 和 2。這大大的提升了性能,讓過濾變得非常的快。 當(dāng)執(zhí)行 `filtered` 查詢時(shí),`filter` 會(huì)比 `query` 早執(zhí)行。結(jié)果字節(jié)集會(huì)被傳給 `query` 來跳過已經(jīng)被排除的文檔。這種過濾器提升性能的方式,查詢更少的文檔意味著更快的速度。