電子商務(wù)網(wǎng)站建設(shè)花費(fèi)今日新聞頭條新聞最新
有時一個匹配項可以覆蓋多個文本字段。 在這種情況下,你可以使用 combined_fields 查詢來搜索多個文本字段,就好像它們的值實際上已被索引到一個組合字段中一樣。 除此之外,combined_fields 的主要好處是強(qiáng)大且易于理解的評分算法。這種做法也有類似于 copy_to??????? 的處理方法。
combined_fields 查詢屬于全文查詢組,它允許你搜索已分析的文本字段(例如,錯誤消息)。
當(dāng)字段映射中沒有指定 search_analyzer 時,分析器將默認(rèn)為索引時應(yīng)用于該字段的分析器,并使用該分析器來處理查詢字符串。 如果在字段映射中指定了 search_analyzer,則此分析器將是用于處理查詢字符串的分析器。
分析器只是一個由三個更小的組件構(gòu)建而成的組件:字符過濾器、標(biāo)記器和標(biāo)記過濾器,無論是內(nèi)置的還是自定義的。 這些構(gòu)建塊被內(nèi)置的分析器預(yù)先打包到各種語言和各種文本的分析器中。 Elasticsearch 還公開了各個構(gòu)建塊,允許將它們合并以創(chuàng)建新的自定義分析器。 你可以在此處閱讀有關(guān)分析器的更多信息。
combined fields 查詢支持搜索多個文本字段,就好像它們的內(nèi)容已被索引到一個組合字段中一樣。 該查詢采用把輸入字符串當(dāng)做以 term 為中心的輸入:首先它將查詢字符串分析為單獨(dú)的 term,然后在任何字段中查找每個詞。 當(dāng)匹配可能跨越多個文本字段(例如文章的 title、abstract 和 body)時,此查詢特別有用。比如我們寫入如下的一個文檔:
PUT combined_index/_doc/1
{"title": "Elasticsearch database is very useful","abstract": "This is a very popular system nowadays","body": "Elasticsearch is today one of the most popular database systems available today. This Elasticsearch tutorial provides new users with the prerequisite knowledge and tools to start using Elasticsearch. It includes installation instructions, and initial indexing and data handling instructions."
}
我們可以使用如下的搜索來針對 tille, abstract 及 body 同時進(jìn)行查詢:
GET combined_index/_search?filter_path=**.hits
{"query": {"combined_fields": {"query": "database systems","fields": ["title", "abstract", "body"],"operator": "and"}}
}
上面命令搜索返回的結(jié)果為:
{"hits": {"hits": [{"_index": "combined_index","_id": "1","_score": 0.6877647,"_ignored": ["body.keyword"],"_source": {"title": "Elasticsearch database is very useful","abstract": "This is a very popular system nowadays","body": "Elasticsearch is today one of the most popular database systems available today. This Elasticsearch tutorial provides new users with the prerequisite knowledge and tools to start using Elasticsearch. It includes installation instructions, and initial indexing and data handling instructions."}}]}
}
乍一看,是不是有點(diǎn)覺得像 mulit-match 查詢的樣子啊?這在我們下面來進(jìn)行比較。
combined_fields 查詢采用基于概率相關(guān)性框架:BM25 及以后中描述的簡單 BM25F 公式的原則性評分方法。 在對匹配項進(jìn)行評分時,查詢會跨字段組合術(shù)語和集合統(tǒng)計信息來對每個匹配項進(jìn)行評分,就好像指定字段已被索引到單個組合字段中一樣。 這個得分是最好的嘗試; combined_fields 做了一些近似,分?jǐn)?shù)不會完全服從 BM25F 模型。
警告:字段數(shù)量限制。默認(rèn)情況下,查詢可以包含的子句數(shù)量是有限制的。 此限制由 indices.query.bool.max_clause_count 設(shè)置定義,默認(rèn)為 4096。對于combined fileds 查詢,子句數(shù)計算為字段數(shù)乘以術(shù)語數(shù)。
這個查詢有什么用?
combined_fields 查詢使你能夠搜索多個文本字段,就好像它們的索引值已被索引到一個組合字段中一樣。 combined_fields 查詢在匹配可能涵蓋多個文本字段時很方便。
combined_fields 查詢通過采用以 term 為中心的查詢視圖來工作。 它將查詢字符串分析為單個術(shù)語,然后在任何字段中搜索每個術(shù)語。 可以使用此查詢代替跨字段 multi_match 查詢。 它提供了更直接的行為和更強(qiáng)大的評分系統(tǒng)。 combined_fields 查詢僅適用于具有完全相同的搜索分析器的字段,而 multi_match 查詢不關(guān)心字段是否具有相同的搜索分析器。
字段分?jǐn)?shù)加權(quán)
字段分?jǐn)?shù)加權(quán)是 combined fields 模型而定的。 例如,如果標(biāo)題 title 的提升為 2,則計算分?jǐn)?shù)時就好像 title 中的每個術(shù)語在合成組合字段中出現(xiàn)了兩次一樣。
GET /_search
{"query": {"combined_fields" : {"query" : "distributed consensus","fields" : [ "title^2", "body" ] }}
}
如上所示,當(dāng)我們想對 title 字段進(jìn)行加權(quán)時,我們可以使用 ^ 符號來進(jìn)行表述。
注意:combined_fields 查詢要求字段提升大于或等于 1.0。 字段增強(qiáng)允許是浮點(diǎn)數(shù),比如 2.2 等。
combined_fields 的參數(shù)
fields
???????(必需,字符串?dāng)?shù)組)要搜索的字段列表。 允許字段通配符模式。 僅支持文本字段,并且它們必須都具有相同的搜索分析器。
query
????????(必需,字符串)要在提供的 <fields> 中搜索的文本。
????????combined_fields 查詢在執(zhí)行搜索之前分析提供的文本。
auto_generate_synonyms_phrase_query
????????(可選,布爾值)如果為真,則會自動為 multi-term 同義詞創(chuàng)建 match phrase 查詢。默認(rèn)為 true。
????????有關(guān)系的例子,請參看 Use synonyms with match query。
Operator
????????(可選,字符串)布爾邏輯,用于解釋查詢值中的文本。 有效值為:
? ? ? ? ????????or(默認(rèn))
????????????????????????例如,database systems 的查詢值被解釋為 database OR systems
? ? ? ? ????????and
????????????????????????例如,database systems 的查詢值被解釋為 database AND systems
minimum_should_match
????????(可選,字符串)要返回的文檔必須匹配的最小子句數(shù)。 有關(guān)有效值和更多信息,請參閱 minimum_should_match?參數(shù)。
zero_terms_query
????????(可選,字符串)指示如果分析器刪除所有分詞時是否不返回任何文檔,例如在使用 stop 過濾器時。 有效值為:
? ? ? ? ? none(默認(rèn))
????????????????如果分析器刪除所有分詞,則不會返回任何文檔。
? ? ? ? ?all
????????????????返回所有文檔,類似于 match_all 查詢。
????????????????有關(guān)示例,請參見?Zero terms query?。
和 multi-match 查詢比較
combined_fields 查詢提供了一種跨多個文本字段進(jìn)行匹配和評分的原則性方法。 為了支持這一點(diǎn),它要求所有字段都具有相同的搜索分析器。
如你想要一個處理不同類型字段(如 keyword 或 numbers)的查詢,那么 multi_match 查詢可能更合適。 它支持文本和非文本字段,并接受不共享同一分析器的文本字段。
主要的 multi_match 模式 best_fields 和 most_fields?采用以字段為中心的查詢視圖。 相比之下,combined_fields 是以 term 為中心的:operator 和 minimum_should_match 應(yīng)用于每個 term,而不是每個字段。 具體來說,像這樣的查詢:
GET /_search
{"query": {"combined_fields" : {"query": "database systems","fields": [ "title", "abstract"],"operator": "and"}}
}
被執(zhí)行為:
+(combined("database", fields:["title" "abstract"]))
+(combined("systems", fields:["title", "abstract"]))
換句話說,每個術(shù)語必須出現(xiàn)在至少一個字段中才能匹配文檔。
cross_fields multi_match 模式也采用以術(shù)語為中心的方法,并為每個術(shù)語應(yīng)用 operator 和 minimum_should_match。 combined_fields 相對于 cross_fields 的主要優(yōu)勢是其基于 BM25F 算法的強(qiáng)大且可解釋的評分方法。
注意:Custom similarities
combined_fields 查詢目前只支持 BM25 相似度,這是默認(rèn)的,除非配置了 Custom similarities。 Per-field similarities?也是不允許的。 在任何一種情況下使用 combined_fields 都會導(dǎo)致錯誤。