1. 程式人生 > >[Elasticsearch] 全文搜尋 (三)

[Elasticsearch] 全文搜尋 (三)

match查詢是如何使用bool查詢的

現在,你也許意識到了使用了match查詢的多詞查詢只是簡單地將生成的term查詢包含在了一個bool查詢中。通過預設的or操作符,每個term查詢都以一個語句被新增,所以至少一個should語句需要被匹配。以下兩個查詢是等價的:

{
    "match": { "title": "brown fox"}
}

{
  "bool": {
    "should": [
      { "term": { "title": "brown" }},
      { "term": { "title": "fox"   }}
    ]
  }
}

使用and

操作符時,所有的term查詢都以must語句被新增,因此所有的查詢都需要匹配。以下兩個查詢是等價的:

{
    "match": {
        "title": {
            "query":    "brown fox",
            "operator": "and"
        }
    }
}

{
  "bool": {
    "must": [
      { "term": { "title": "brown" }},
      { "term": { "title": "fox"   }}
    ]
  }
}

如果指定了minimum_should_match

引數,它會直接被傳入到bool查詢中,因此下面兩個查詢是等價的:

{
    "match": {
        "title": {
            "query":                "quick brown fox",
            "minimum_should_match": "75%"
        }
    }
}

{
  "bool": {
    "should": [
      { "term": { "title": "brown" }},
      { "term": { "title": "fox"   }},
      { "
term"
: { "title": "quick" }} ], "minimum_should_match": 2 } }

因為只有3個查詢語句,minimum_should_match的值75%會被向下舍入到2。即至少兩個should語句需要匹配。

當然,我們可以通過match查詢來編寫這類查詢,但是理解match查詢的內部工作原理能夠讓你根據需要來控制該過程。有些行為無法通過一個match查詢完成,比如對部分查詢詞條給予更多的權重。在下一節中我們會看到一個例子。

提升查詢子句(Boosting Query Clause)

當然,bool查詢並不是只能合併簡單的單詞(One-word)match查詢。它能夠合併任何其它的查詢,包括其它的bool查詢。它通常被用來通過合併數個單獨的查詢的分值來調優每份文件的相關度_score

假設我們需要搜尋和"full-text search"相關的文件,但是我們想要給予那些提到了"Elasticsearch"或者"Lucene"的文件更多權重。更多權重的意思是,對於提到了"Elasticsearch"或者"Lucene"的文件,它們的相關度_score會更高,即它們會出現在結果列表的前面。

一個簡單的bool查詢能夠讓我們表達較為複雜的邏輯:

GET /_search
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "content": { 
                        "query":    "full text search",
                        "operator": "and"
                    }
                }
            },
            "should": [ 
                { "match": { "content": "Elasticsearch" }},
                { "match": { "content": "Lucene"        }}
            ]
        }
    }
}
  1. content欄位必須含有fulltextsearch這三個詞條
  2. 如果content欄位也含有了詞條Elasticsearch或者Lucene,那麼該文件會有一個較高的_score

should查詢子句的匹配數量越多,那麼文件的相關度就越高。目前為止還不錯。

但是如果我們想給含有Lucene的文件多一些權重,同時給含有Elasticsearch的文件更多一些權重呢?

我們可以通過指定一個boost值來控制每個查詢子句的相對權重,該值預設為1。一個大於1boost會增加該查詢子句的相對權重。因此我們可以將上述查詢重寫如下:

GET /_search
{
    "query": {
        "bool": {
            "must": {
                "match": {  
                    "content": {
                        "query":    "full text search",
                        "operator": "and"
                    }
                }
            },
            "should": [
                { "match": {
                    "content": {
                        "query": "Elasticsearch",
                        "boost": 3 
                    }
                }},
                { "match": {
                    "content": {
                        "query": "Lucene",
                        "boost": 2 
                    }
                }}
            ]
        }
    }
}

NOTE

boost引數被用來增加一個子句的相對權重(當boost大於1時),或者減小相對權重(當boost介於01時),但是增加或者減小不是線性的。換言之,boost設為2並不會讓最終的_score加倍。

相反,新的_score會在適用了boost後被歸一化(Normalized)。每種查詢都有自己的歸一化演算法(Normalization Algorithm),演算法的細節超出了本書的討論範圍。但是能夠說一個高的boost值會產生一個高的_score

如果你在實現你自己的不基於TF/IDF的相關度分值模型並且你需要對提升過程擁有更多的控制,你可以使用function_score查詢,它不通過歸一化步驟對文件的boost進行操作。

在下一章中,我們會介紹其它的用於合併查詢的方法,多欄位查詢(Multifield Search)。但是,首先讓我們看看查詢的另一個重要特定:文字分析(Text Analysis)。


相關推薦

[Elasticsearch] 全文搜尋 ()

match查詢是如何使用bool查詢的 現在,你也許意識到了使用了match查詢的多詞查詢只是簡單地將生成的term查詢包含在了一個bool查詢中。通過預設的or操作符,每個term查詢都以一個語句被新增,所以至少一個should語句需要被匹配。以下兩個查詢是等價的:

Elasticsearch全文搜尋控制精準度

前言 本文主要是關於全文搜尋控制精準度的操作 其他搜尋請參考: 一、使用operator 搜尋結果中必須至少包括run、jump兩種愛好 GET people/_search {

[Elasticsearch] 全文搜尋 (二)

多詞查詢(Multi-word Queries) 如果我們一次只能搜尋一個詞,那麼全文搜尋就會顯得相當不靈活。幸運的是,通過match查詢來實現多詞查詢也同樣簡單: GET /my_index/my_type/_search { "query": {

laravel-elasticsearch 全文搜尋設定

1、首先安裝 jave環境 jdk 下載地址 ,我用的是最新版本的,有時版本要跟elasticsearch對應 2、安裝elasticsearch 下載地址 3、安裝Laravel scout 全文搜尋包,這裡我用的是5.0.3版本,tamayo/laravel-scout-elastic .這

ElasticSearch最佳入門實踐(十八)精確匹配與全文搜尋的對比分析

1、ES中的兩種搜尋模式 1、exact value 2、full text 2、exact value 2017-01-01,exact value,搜尋的時候,必須輸入2017-01-01,才能搜尋出來。如果你輸入一個01,是搜尋不

瞭解學習 Elasticsearch 及其與 Python 實現全文搜尋

Elasticsearch簡介 ElasticSearch是一個基於Lucene的搜尋伺服器.它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放原始碼釋出,是當前流行的企業級搜尋引擎。設計

使用haystack實現Django的全文搜尋 -- Elasticsearch搜尋引擎

全文搜尋: 在使用python進行web開發的時候,免不了需要使用到全文搜尋;全文搜尋和我們平常使用的資料庫的模糊搜尋查詢不一樣,例如在mysql資料庫中,如果進行模糊查詢,比如 name like '%wang%'這一類的,效率是非常低的;而我們需求的全文搜尋,在效率方面要求是很高

全文搜尋儲存引擎 Elasticsearch 一點點

開始請大家想一個問題,如何統計一個Web站點的有效PV? 針對使用者請求的URL,統計時做模式匹配-------->即使用者真正去開啟一個站點的有效頁面並對每個頁面的入口的訪問做一個統計瀏覽量; 簡要搜尋引擎 搜尋引擎在網際網路上特別多有專業(Startpage,Google,Yah

Elasticsearch實戰():高階搜尋(中文+拼音+首字母+簡繁轉換+補全)

1、中文搜尋、英文搜尋、中英混搜  如:“紫光股份”,“紫光gufen” 2、全拼搜尋、首字母搜尋、中文+全拼、中文+首字母混搜   如:“ziguanggufen”,“紫光gufen”,“紫光gf”,“zggf”,“ziguanggf”等等組合 3、簡繁搜尋 4.關鍵

ASP.NET Web API + Elasticsearch 6.x 快速做個全文搜尋

最近想做個全文搜尋,設想用 ASP.NET Web API + Elasticsearch 6.x 來實現。 網上搜了下 Elasticsearch 的資料,大部分是講 linux 平臺下如何用 java 來開發,有少量講在 windows 平臺下用 c# 開發的,且版本是 Elasti

elasticsearch筆記_全文搜尋_query(五)

全文搜尋(Query) 全文搜尋最重要的兩個方面就是”相關性(Relevance)”和”分析(Analysis)” . 相關性(Relevance) 每個文件都有相關性評分,用一個正浮點數字段 _score 來表示 。_score 評分越高 ,

Elasticsearch:一個方便易用的全文搜尋

注:本文內容均來自《Elasticsearch權威指南》,是做讀書筆記,同時做一個總結。 Elasticsearch是使用基於http的RestFul來實現和使用的,因此使用curl來測試。如果不使用curl,使用各種語言的對應http請求即可使用。 Ela

elasticsearch全文搜尋

1.場景還原    近期,筆者專案中需要通過關鍵字來搜尋與之相關的資料,es的全文搜尋終於派上用場了! 2.準備步驟 ②在es的plugins目錄下建立ik,然後解壓縮ik ③在elasticsearch.yml配置ik屬性 index.analysis.ana

lucene全文搜尋:生成索引欄位,建立索引文件(給索引欄位加權)基於lucene5.5.3

前言:上一章中我們已經實現了索引器的建立,但是我們沒有索引文件,本章將會講解如何生成欄位、建立索引文件,給欄位加權以及儲存文件到索引器目錄 一、建立索引文件 一個索引目錄可以放多個索引文件,每個索引

elasticsearch 精確匹配與全文搜尋

elasticsearch的兩種搜尋模式:exact value、full text。 一、exact value(精確匹配) 介紹: 比如搜尋2017-01-01,使用exact value搜尋的時候,必須輸入2017-01-01,才能搜尋出來;如果輸

Elasticsearch(六)瞭解全文搜尋

遇到的問題 通過前面的學習,我們已經可以使用elasticsearch來進行資料的搜尋了,但此時我們發現了一個問題,這個問題如果沒有解決好就很影響我們後續的使用,那麼該問題是什麼呢?我們來看一下: 上面的截圖是我搜索“在”關鍵字出來的結果,按照正常情況下,我們是不是不應該搜

Elasticsearch系列---深入全文搜尋

概要 本篇介紹怎樣在全文欄位中搜索到最相關的文件,包含手動控制搜尋的精準度,搜尋條件權重控制。 手動控制搜尋的精準度 搜尋的兩個重要維度:相關性(Relevance)和分析(Analysis)。 相關性是評價查詢條件與結果的相關程度,並對相關程度進行排序,一般使用TF/IDF方法。 分析是指將索引文件與查詢條

Elasticsearch構建全文搜尋系統

[toc] # 前言 Elasticsearch 是一個分散式、可擴充套件、實時的搜尋與資料分析引擎,通過它我們可以構建出一個強大的全文搜尋系統,解決諸如文章檢索慢,商品檢索慢、MySQL的like查詢慢這樣的問題。 Elasticsearch是基於hadoop創始人道哥的另一傑作Lucene實現的,速度非

Elasticsearch全文檢索,高亮關鍵字

code spa nsh pes lds exp response sets highlight 問題 用如下這樣的term方式,可以高亮 .setQuery(QueryBuilders.termQuery("PARAM_NAME", "a")) { "query":

Elasticsearch全文檢索工具入門

使用步驟 artifact rop 創建 是否 方式 cluster 包名 Lucene 1 Elasticsearch全文檢索工具入門: 2 1.下載對應系統版本的文件 3 elasticsearch-2.4.0.zip 4