我在這里描述了索引和資料,并且我已經將分析器設定為停止分析器。這很好用,因為當我嘗試像 POST https://serverURL/_search?pretty=true 這樣的簡單搜索時
{
"query": {
"query_string": {
"default_field": "title",
"query": "Rebel the without" }
}
}
, 服務器真的回傳
"title": "Rebel Without a Cause"
結果。
但是,當我嘗試使用模糊搜索時
{
"query": {
"fuzzy": {
"title": {
"value": "Rebel the without"
}
}
}
}
,結果為空。這里到底發生了什么,模糊搜索是否會以某種方式禁用分析器?
uj5u.com熱心網友回復:
模糊查詢回傳包含與搜索詞相似的詞的檔案。
由于您沒有為“title”欄位定義任何顯式映射,因此它使用標準分析器,生成的令牌將是:
{
"tokens" : [
{
"token" : "rebel",
"start_offset" : 0,
"end_offset" : 5,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "without",
"start_offset" : 6,
"end_offset" : 13,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "a",
"start_offset" : 14,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "cause",
"start_offset" : 16,
"end_offset" : 21,
"type" : "<ALPHANUM>",
"position" : 3
}
]
}
模糊查詢會給你造成了這是類似等生成的令牌的搜索字詞wihout,case,rebe,等
GET /myidx/_search
{
"query": {
"fuzzy": {
"title": {
"value": "case"
}
}
}
}
更新1:
根據下面的評論,您可以使用match bool 前綴查詢
{
"query": {
"match_bool_prefix": {
"title": {
"query": "Rebel the without"
}
}
}
}
uj5u.com熱心網友回復:
了解資料在 Elasticsearch 中的處理和存盤方式對于理解這種行為非常重要。因此,當您設定stop分析器時,您提供給系統的任何文本都將轉換為令牌串列,即術語。此時,Elasticsearch 欄位“不記得”您的原始文本(從技術上講,它存盤在該_source欄位中,但未編入索引)并且只知道這些術語(在您的情況下,每個術語都加上其在原始文本中的位置 - rebel, without, cause)然后存盤在倒排索引中以便快速查找。
現在您運行fuzzy查詢 - 這是一個術語級別的查詢,這意味著它適用于特定術語。相反,您必須使用全文查詢,例如match:
POST /fuzz/_search
{
"query": {
"match": {
"title": {
"query": "Reble without",
"fuzziness": "AUTO"
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/408447.html
標籤:
