elasticsearch 單字段多個索引和text字段如何做精確匹配


項目場景:

text類型的字段,他的值會被分詞,所以無法精確匹配

在實際使用ES過程中,經常會遇到這樣的問題
既需要對一個字段進行全文檢索,又要對該字段進行等值查詢。
我們知道全文檢索的字段類型需要設置為text,但是text字段類型又不支持term等值查詢。那么怎么解決這個問題呢?
答案是通過fields進行多字段配置

fields說明

為了不同的目的以不同的方式索引相同的字段通常很有用。這就是fields多字段的目的。
例如,一個string 字段可以被映射為一個text類型用於全文搜索的keyword字段,以及一個keyword類型用於等值比較、排序或聚合的字段。

fields主要使用場景:

對一個字段配置多個類型的type以應對不同的查詢場景
對一個字段配置多個分詞規則以支持多種全文檢索規則
官網說明
多字段Multi-fields允許為不同目的以多種方式索引相同的字符串值,例如一個字段用於搜索和一個多字段用於排序和聚合,或者由不同的分析器分析相同的字符串值。

同字段多type配置

創建索引,在mapping中通過fields關鍵字給city字段添加別名raw,類型為keyword,用來做精確匹配以及排序。

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "city": {
        "type": "text",
        "fields": {
          "raw": { 
            "type":  "keyword"
          }
        }
      }
    }
  }
}

添加數據

PUT my-index-000001/_doc/1
{
  "city": "New York"
}

PUT my-index-000001/_doc/2
{
  "city": "York"
}

查詢

通過city.raw使用city的別名raw進行排序

GET my-index-000001/_search
{
  "query": {
    "match": {
      "city": "york" 
    }
  },
  "sort": {
    "city.raw": "asc" 
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "city.raw" 
      }
    }
  }
}

同字段多分詞規則配置

有些場景,我們需要一個字段,滿足多套分詞規則的檢索。

新建索引

字段text,默認采用standard analyzer分詞器;
通過fields聲明別名english,采用english分詞器。

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "text": { 
        "type": "text",
        "fields": {
          "english": { 
            "type":     "text",
            "analyzer": "english"
          }
        }
      }
    }
  }
}

添加測試數據

PUT my-index-000001/_doc/1
{ "text": "quick brown fox" } 

PUT my-index-000001/_doc/2
{ "text": "quick brown foxes" } 

查詢測試

說明:利用multi_match多字段匹配查詢,實現一個字段多種分詞規則檢索。

GET my-index-000001/_search
{undefined
“query”: {undefined
“multi_match”: {undefined
“query”: “quick brown foxes”,
“fields”: [
“text”,
“text.english”
],
“type”: “most_fields”
}
}
}

總結:
本文主要是介紹了ES中通過fields定義字段別名,實現對text字段進行精准匹配。
1、text字段用來做全文檢索,keyword字段用來做等值匹配、排序和聚合運算。
2、怎么通過fields給字段定義別名
3、fields多字段的2種典型運用場景:

1個字段數據需要對應多個type類型
1個字段數據需要滿足多種分詞匹配規則


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM