如何打造Elasticsearch全文检索系统之copy_to

本文介绍了如何使用Elasticsearch的copy_to功能来实现全文检索时的一次性多字段查询,提高效率。通过创建mapping,设置copy_to字段,聚合查询校验,展示了如何将多个字段合并到一个字段进行检索和聚合,从而避免多次查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全文检索场景在实际项目中,无界搜索具体查询某一个字段对于客户来说是不确定的,但是实际数据中需要检索的字段非常多。
在使用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插件查看时显示,但是能通过查询语句作为条件
总结:通过这种方式对我们的结果进行聚合,能够满足一次查询聚合多个字段。

Elasticsearch的`copy_to`字段是一种用于在索引过程中将字段值复制到另一个字段的机制。它允许您将一个或多个字段的内容复制到一个新的目标字段中,以便在搜索和分析过程中更方便地访问。 `copy_to`的原理是,在文档索引时,Elasticsearch会将指定的源字段的值复制到目标字段中。这样,当执行搜索操作时,您可以直接在目标字段上执行查询,而不必考虑源字段。这对于需要在多个字段上执行相似查询的情况非常有用。 在创建索引映射时,您可以为字段指定`copy_to`属性,指定将其值复制到目标字段。例如,假设您有一个名为`title`的源字段和一个名为`combined`的目标字段,您可以将`title`字段的内容复制到`combined`字段中: ``` PUT my_index { "mappings": { "properties": { "title": { "type": "text", "copy_to": "combined" }, "combined": { "type": "text" } } } } ``` 当您索引一个文档时,`title`字段的值将自动复制到`combined`字段中。这样,您就可以在搜索时直接对`combined`字段执行查询操作,而不必考虑`title`字段。 请注意,`copy_to`并不是实时的操作,它只在文档索引时生效。因此,对源字段进行更新不会自动触发目标字段的更新。如果您对源字段进行了更改,您需要手动重新索引文档以确保目标字段的值也得到更新。 希望这个解释对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

格赚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值