項目場景:
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個字段數據需要滿足多種分詞匹配規則