Elasticsearch 高級(jí)搜索技巧和最佳實(shí)踐
?? ?
?? ?Elasticsearch 是一個(gè)開源的分布式搜索和分析引擎,它支持實(shí)時(shí)地存儲(chǔ)、搜索和分析大規(guī)模數(shù)據(jù)。它被廣泛應(yīng)用于各行各業(yè),用于構(gòu)建高性能的搜索引擎、日志分析系統(tǒng)、電子商務(wù)推薦系統(tǒng)等。
?? ?
?? ?本文將介紹 Elasticsearch 的高級(jí)搜索技巧和最佳實(shí)踐,包括如何構(gòu)建復(fù)雜的查詢、使用各種查詢類型以及優(yōu)化搜索性能。同時(shí)會(huì)提供相關(guān)的編程代碼和配置示例,以幫助讀者更好地理解這些搜索技巧和最佳實(shí)踐。
?
?? ?### 1. 基本搜索及其參數(shù)
?? ?
?? ?#### 匹配查詢
?? ?
?? ?匹配查詢是 Elasticsearch 中最基本的查詢類型,它會(huì)將查詢字符串與索引中的字段進(jìn)行匹配,并返回匹配的結(jié)果。以下是一個(gè)使用匹配查詢的例子:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"match": {
?? ? ? ? ?"title": "Elasticsearch"
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們?cè)?`my_index` 索引中查詢所有包含 "Elasticsearch" 的文檔。
?? ?
?? ?#### 多字段查詢
?? ?
?? ?有時(shí)我們需要在多個(gè)字段中進(jìn)行查詢,并返回匹配任意字段的結(jié)果。以下是一個(gè)使用多字段查詢的例子:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"multi_match": {
?? ? ? ? ?"query": "Elasticsearch",
?? ? ? ? ?"fields": ["title", "content"]
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們?cè)?`title` 和 `content` 字段中查詢包含 "Elasticsearch" 的文檔。
?? ?
?? ?#### 前綴查詢
?? ?
?? ?前綴查詢用于匹配以指定前綴開頭的文本。以下是一個(gè)使用前綴查詢的例子:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"prefix": {
?? ? ? ? ?"title": "ela"
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們?cè)?`title` 字段中查詢以 "ela" 開頭的文檔。
?? ?
?? ?#### 通配符查詢
?? ?
?? ?通配符查詢?cè)试S我們使用通配符來(lái)匹配文本。以下是一個(gè)使用通配符查詢的例子:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"wildcard": {
?? ? ? ? ?"title": "el*sear*"
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們?cè)?`title` 字段中查詢匹配模式 "el*sear*" 的文檔。
?? ?
?? ?#### 正則表達(dá)式查詢
?? ?
?? ?正則表達(dá)式查詢?cè)试S我們使用正則表達(dá)式來(lái)匹配文本。以下是一個(gè)使用正則表達(dá)式查詢的例子:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"regexp": {
?? ? ? ? ?"title": "el[a-z]*sear[a-z]*"
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們?cè)?`title` 字段中查詢匹配正則表達(dá)式模式 "el[a-z]*sear[a-z]*" 的文檔。
?? ?
?? ?#### 范圍查詢
?? ?
?? ?范圍查詢用于匹配一個(gè)指定范圍內(nèi)的數(shù)值或日期。以下是一個(gè)使用范圍查詢的例子:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"range": {
?? ? ? ? ?"price": {
?? ? ? ? ? ?"gte": 100,
?? ? ? ? ? ?"lte": 200
?? ? ? ? ?}
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們?cè)?`price` 字段中查詢價(jià)格在 100 到 200 之間的文檔。
?? ?
?? ?以上僅為基本搜索的一些示例,Elasticsearch 還提供了更多強(qiáng)大的查詢類型和參數(shù)供我們使用。接下來(lái)我們將介紹復(fù)合查詢。
?? ?
?? ?### 2. 復(fù)合查詢
?? ?
?? ?復(fù)合查詢是由多個(gè)查詢組合而成的查詢,它可以更靈活地滿足我們的搜索需求。
?? ?
?? ?#### Bool 查詢
?? ?
?? ?Bool 查詢是 Elasticsearch 中最常用的復(fù)合查詢類型,它將多個(gè)子查詢通過(guò)邏輯運(yùn)算符組合在一起。以下是一個(gè)使用 Bool 查詢的例子:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"bool": {
?? ? ? ? ?"must": [
?? ? ? ? ? ?{ "term": { "title": "Elasticsearch" } },
?? ? ? ? ? ?{ "range": { "price": { "gte": 100 } } }
?? ? ? ? ?],
?? ? ? ? ?"must_not": [
?? ? ? ? ? ?{ "term": { "category": "deprecated" } }
?? ? ? ? ?],
?? ? ? ? ?"should": [
?? ? ? ? ? ?{ "term": { "tags": "search" } },
?? ? ? ? ? ?{ "term": { "tags": "analysis" } }
?? ? ? ? ?],
?? ? ? ? ?"filter": {
?? ? ? ? ? ?"range": { "date": { "gte": "2022-01-01" } }
?? ? ? ? ?}
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們使用 Bool 查詢構(gòu)建了一個(gè)復(fù)合查詢。其中 `must` 條件表示必須滿足的查詢,`must_not` 條件表示不能滿足的查詢,`should` 條件表示應(yīng)該滿足的查詢,`filter` 條件用于縮小范圍。這樣結(jié)合不同的條件和邏輯運(yùn)算符,我們可以實(shí)現(xiàn)更精確的查詢。
?? ?
?? ?#### Constant Score 查詢
?? ?
?? ?Constant Score 查詢是一個(gè)簡(jiǎn)單的復(fù)合查詢類型,它會(huì)給每個(gè)符合條件的文檔指定一個(gè)固定的分?jǐn)?shù),不考慮實(shí)際匹配度。以下是一個(gè)使用 Constant Score 查詢的例子:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"constant_score": {
?? ? ? ? ?"filter": {
?? ? ? ? ? ?"term": { "category": "search" }
?? ? ? ? ?},
?? ? ? ? ?"boost": 1.2
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們使用 Constant Score 查詢對(duì)所有包含 "search" 的文檔進(jìn)行匹配,并為它們?cè)O(shè)置一個(gè)固定的分?jǐn)?shù) 1.2。
?? ?
?? ?#### Dis Max 查詢
?? ?
?? ?Dis Max 查詢是一個(gè)復(fù)合查詢類型,它將多個(gè)子查詢分別計(jì)算得分,并返回最高分的文檔。以下是一個(gè)使用 Dis Max 查詢的例子:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"dis_max": {
?? ? ? ? ?"queries": [
?? ? ? ? ? ?{ "term": { "title": "Elasticsearch" } },
?? ? ? ? ? ?{ "term": { "content": "Elasticsearch" } }
?? ? ? ? ?],
?? ? ? ? ?"tie_breaker": 0.2
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們使用 Dis Max 查詢對(duì) `title` 和 `content` 字段進(jìn)行匹配,并返回得分最高的文檔。`tie_breaker` 參數(shù)用于調(diào)整子查詢得分的權(quán)重。
?? ?
?? ?#### Function Score 查詢
?? ?
?? ?Function Score 查詢是一個(gè)復(fù)合查詢類型,它通過(guò)將自定義的函數(shù)應(yīng)用于每個(gè)文檔的得分,來(lái)調(diào)整搜索結(jié)果的排序或過(guò)濾。以下是一個(gè)使用 Function Score 查詢的例子:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"function_score": {
?? ? ? ? ?"query": { "match_all": {} },
?? ? ? ? ?"functions": [
?? ? ? ? ? ?{ "filter": { "term": { "category": "search" } }, "weight": 2 },
?? ? ? ? ? ?{ "filter": { "term": { "category": "analysis" } }, "weight": 1 }
?? ? ? ? ?],
?? ? ? ? ?"boost_mode": "sum"
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們使用 Function Score 查詢對(duì)所有文檔進(jìn)行匹配,并通過(guò)自定義的函數(shù)給不同的 `category` 字段設(shè)置不同的權(quán)重,最后將得分求和作為最終的排序依據(jù)。
?? ?
?? ?### 3. 高亮搜索結(jié)果
?? ?
?? ?在搜索結(jié)果中高亮顯示匹配的關(guān)鍵詞可以幫助用戶更好地定位結(jié)果。以下是一個(gè)使用高亮的搜索示例:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"match": {
?? ? ? ? ?"content": "Elasticsearch"
?? ? ? ?}
?? ? ?},
?? ? ?"highlight": {
?? ? ? ?"fields": {
?? ? ? ? ?"content": {}
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們?cè)?`content` 字段中搜索包含 "Elasticsearch" 的文檔,并使用高亮顯示匹配的關(guān)鍵詞。
?? ?
?? ?### 4. 排序與分頁(yè)
?? ?
?? ?通過(guò)排序可以將搜索結(jié)果按照指定的字段進(jìn)行排序,而分頁(yè)可以將搜索結(jié)果按照指定的頁(yè)碼和每頁(yè)大小進(jìn)行分頁(yè)顯示。以下是一個(gè)排序和分頁(yè)的搜索示例:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"query": {
?? ? ? ?"match_all": {}
?? ? ?},
?? ? ?"sort": [
?? ? ? ?{ "price": "asc" }
?? ? ?],
?? ? ?"from": 0,
?? ? ?"size": 10
?? ?}
?? ?
?? ?
?? ?上述示例中,我們對(duì)所有文檔進(jìn)行排序,按照 `price` 字段的升序排列。同時(shí)設(shè)置 `from` 和 `size` 參數(shù),表示從第 0 條記錄開始,每頁(yè)顯示 10 條記錄。
?? ?
?? ?### 5. 聚合查詢
?? ?
?? ?聚合查詢可以對(duì)搜索結(jié)果進(jìn)行統(tǒng)計(jì)和分析,并返回相應(yīng)的聚合結(jié)果。以下是一個(gè)使用聚合查詢的示例:
?? ?
?? ?json
?? ?GET /my_index/_search
?? ?{
?? ? ?"aggs": {
?? ? ? ?"avg_price": {
?? ? ? ? ?"avg": {
?? ? ? ? ? ?"field": "price"
?? ? ? ? ?}
?? ? ? ?}
?? ? ?}
?? ?}
?? ?
?? ?
?? ?上述示例中,我們對(duì) `price` 字段進(jìn)行平均值計(jì)算,并返回聚合結(jié)果。
?? ?
更多文章:技數(shù)未來(lái)網(wǎng) (techdatafuture.com)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-689494.html
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-689494.html
到了這里,關(guān)于Elasticsearch 高級(jí)搜索技巧和最佳實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!