1. 程式人生 > >Elasticsearch全文檢索之copy_to

Elasticsearch全文檢索之copy_to

全文檢索場景在實際專案中,無界搜尋具體查詢某一個欄位對於客戶來說是不確定的,但是實際資料中需要檢索的欄位非常多。 在使用elasticsearch時遇見了這樣的需求:es聚合指定欄位時聚合的結果裡面只顯示聚合的欄位。但是在做報表時,我們發現一個問題:如果我們對員工進行聚合,但是我們還希望檢視當前員工所在的班組,部門等資訊。這時如果查詢es兩次,對於效率來說是不好的。 這樣,我們在設計的時候就需要將更多的欄位合併成一個欄位,這樣查詢的時候,開發人員只需要查詢指定的那個欄位就可以了,中間實現過程很簡單,但是更多的會涉及到效能優化和分詞優化。使用的步驟:

1、建立mapping

  1. PUT my_index

  2. {

  3.   "mappings": {

  4.     "my_type": {

  5.       "properties": {

  6.         "first_name": {

  7.           "type": "keyword",

  8.           "copy_to": "full_name"

  9.         },

  10.         "last_name": {

  11.           "type": "keyword",

  12.           "copy_to": "full_name"

  13.         },

  14.         "full_name": {

  15.           "type": "text",

  16.           "fielddata": true

  17.         }

  18.       }

  19.     }

  20.   }

  21. }

2、插入資料

  1. PUT my_index/my_type/1

  2. {

  3. "first_name": "John",

  4. "last_name": "Smith"

  5. }

3、查詢校驗

  1. GET my_index/_search

  2. {

  3. "query": {

  4. "match": {

  5. "full_name": {

  6. "query": "John Smith",

  7. "operator": "and"

  8. }

  9. }

  10. }

  11. }

4、結果展示

  1. {

  2. "took": 0,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 5,

  6. "successful": 5,

  7. "failed": 0

  8. },

  9. "hits": {

  10. "total": 1,

  11. "max_score": 0.51623213,

  12. "hits": [

  13. {

  14. "_index": "my_index",

  15. "_type": "my_type",

  16. "_id": "1",

  17. "_score": 0.51623213,

  18. "_source": {

  19. "first_name": "John",

  20. "last_name": "Smith"

  21. }

  22. }

  23. ]

  24. }

  25. }

5、聚合查詢校驗

  1. {

  2. "query": {

  3. },"aggs": {

  4. "1": {

  5. "terms": {

  6. "field": "full_name",

  7. "size": 10

  8. }

  9. }

  10. }

  11. }

6、查詢結果

  1. {

  2. "took": 0,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 5,

  6. "successful": 5,

  7. "failed": 0

  8. },

  9. "hits": {

  10. "total": 1,

  11. "max_score": 1,

  12. "hits": [

  13. {

  14. "_index": "baobiaoceshi4",

  15. "_type": "my_type",

  16. "_id": "1",

  17. "_score": 1,

  18. "_source": {

  19. "first_name": "John",

  20. "last_name": "Smith"

  21. }

  22. }

  23. ]

  24. },

  25. "aggregations": {

  26. "1": {

  27. "doc_count_error_upper_bound": 0,

  28. "sum_other_doc_count": 0,

  29. "buckets": [

  30. {

  31. "key": "john",

  32. "doc_count": 1

  33. },

  34. {

  35. "key": "smith",

  36. "doc_count": 1

  37. }

  38. ]

  39. }

  40. }

  41. }

注意有這幾個問題:

1、我們copy_to指向的欄位欄位型別要為:text

2、text型別欄位如果希望進行聚合,設定屬性:"fielddata": true

3、copy_to指向的欄位不會在head外掛檢視時顯示,但是能通過查詢語句作為條件 總結:通過這種方式對我們的結果進行聚合,能夠滿足一次查詢聚合多個欄位。