Elasticsearch全文檢索之copy_to
全文檢索場景在實際專案中,無界搜尋具體查詢某一個欄位對於客戶來說是不確定的,但是實際資料中需要檢索的欄位非常多。 在使用elasticsearch時遇見了這樣的需求:es聚合指定欄位時聚合的結果裡面只顯示聚合的欄位。但是在做報表時,我們發現一個問題:如果我們對員工進行聚合,但是我們還希望檢視當前員工所在的班組,部門等資訊。這時如果查詢es兩次,對於效率來說是不好的。 這樣,我們在設計的時候就需要將更多的欄位合併成一個欄位,這樣查詢的時候,開發人員只需要查詢指定的那個欄位就可以了,中間實現過程很簡單,但是更多的會涉及到效能優化和分詞優化。使用的步驟:
1、建立mapping
-
PUT my_index
-
{
-
"mappings": {
-
"my_type": {
-
"properties": {
-
"first_name": {
-
"type": "keyword",
-
"copy_to": "full_name"
-
},
-
"last_name": {
-
"type": "keyword",
-
"copy_to": "full_name"
-
},
-
"full_name": {
-
"type": "text",
-
"fielddata": true
-
}
-
}
-
}
-
}
-
}
2、插入資料
-
PUT my_index/my_type/1
-
{
-
"first_name": "John",
-
"last_name": "Smith"
-
}
3、查詢校驗
-
GET my_index/_search
-
{
-
"query": {
-
"match": {
-
"full_name": {
-
"query": "John Smith",
-
"operator": "and"
-
}
-
}
-
}
-
}
4、結果展示
-
{
-
"took": 0,
-
"timed_out": false,
-
"_shards": {
-
"total": 5,
-
"successful": 5,
-
"failed": 0
-
},
-
"hits": {
-
"total": 1,
-
"max_score": 0.51623213,
-
"hits": [
-
{
-
"_index": "my_index",
-
"_type": "my_type",
-
"_id": "1",
-
"_score": 0.51623213,
-
"_source": {
-
"first_name": "John",
-
"last_name": "Smith"
-
}
-
}
-
]
-
}
-
}
5、聚合查詢校驗
-
{
-
"query": {
-
},"aggs": {
-
"1": {
-
"terms": {
-
"field": "full_name",
-
"size": 10
-
}
-
}
-
}
-
}
6、查詢結果
-
{
-
"took": 0,
-
"timed_out": false,
-
"_shards": {
-
"total": 5,
-
"successful": 5,
-
"failed": 0
-
},
-
"hits": {
-
"total": 1,
-
"max_score": 1,
-
"hits": [
-
{
-
"_index": "baobiaoceshi4",
-
"_type": "my_type",
-
"_id": "1",
-
"_score": 1,
-
"_source": {
-
"first_name": "John",
-
"last_name": "Smith"
-
}
-
}
-
]
-
},
-
"aggregations": {
-
"1": {
-
"doc_count_error_upper_bound": 0,
-
"sum_other_doc_count": 0,
-
"buckets": [
-
{
-
"key": "john",
-
"doc_count": 1
-
},
-
{
-
"key": "smith",
-
"doc_count": 1
-
}
-
]
-
}
-
}
-
}
注意有這幾個問題:
1、我們copy_to指向的欄位欄位型別要為:text
2、text型別欄位如果希望進行聚合,設定屬性:"fielddata": true
3、copy_to指向的欄位不會在head外掛檢視時顯示,但是能通過查詢語句作為條件 總結:通過這種方式對我們的結果進行聚合,能夠滿足一次查詢聚合多個欄位。