广告位联系
返回顶部
分享到

Elasticsearch percolate 查询示例介绍

java 来源:互联网 作者:佚名 发布时间:2023-01-28 22:23:17 人浏览
摘要

我们将文档索引到 Elasticsearch 中并对其运行查询以获得满足提供的搜索条件的文档。 我们构造一个匹配或术语查询作为输入,匹配查询的文档作为结果返回。 但这不是percolate query的情

我们将文档索引到 Elasticsearch 中并对其运行查询以获得满足提供的搜索条件的文档。 我们构造一个匹配或术语查询作为输入,匹配查询的文档作为结果返回。

但这不是 percolate query 的情况.....

让我们看看这篇文章中的 percolate 查询,看看它有什么用处。

什么是 percolate 查询?

它与 Elasticsearch 搜索的一般工作方式相反。 在 Percolate Query 中,你将提供文档作为输入,以从与输入文档匹配的索引中查找 query。 可以根据已保存的查询使用 Percolate Query 对文档进行分类或标记。

Percolate query 调用 Elasticsearch 经典搜索的逆向 因为,

  • query 将被存储而不是 Elasticsearch 索引中的文档。
  • 文档将用于代替搜索请求中的 query。

Elasticsearch 将生成与输入文档匹配的查询列表。
你可能想知道为什么我需要 Percolate 以及如何使用它? 因此,让我们看看下面的一些用例。

Percolate 用例

基于 percolate query 上面的描述,我们可以把它应用于如下的一些查询用例:

  • 假设你正在开发一家在线商店,并提供在特定产品在特定价格范围内或以特定折扣上市时创建提醒的功能。
  • 你正在创建推文或帖子分析,并且需要只考虑符合特定条款或条件的内容。 此外,每条满足特定要求的推文或帖子都需要使用特定标签进行标记。

Percolate query 实施

让我们通过一个在线商店用例来更详细地探索 Percolate。

假设消费者希望在 Apple iPhone 12 售价 500 美元时收到通知。

1

brand:apple AND price<500 AND model:'iphone 12'

使用一些示例数据创建 products 索引:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

`

 PUT products

 {

   "mappings": {

     "properties": {

       "brand": {

         "type": "text",

         "fields": {

           "keyword": {

             "type": "keyword"

            }

          }

        },

        "model": {

          "type": "text",

          "fields": {

            "keyword": {

              "type": "keyword"

            }

          }

        },

        "price": {

          "type": "long"

        }

      }

    }

  }

  PUT products/_bulk

  { "index" : { "_id": "prod101" } }

  { "brand" : "Apple", "model" : "iphone 11", "price": 800 }

  { "index" : { "_id": "prod102" } }

  { "brand" : "Samsung", "model" : "galaxy m32", "price": 700 }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

创建 percolate 索引:

必须将原始索引中的相同字段映射添加到 percolate 索引中。 只有需要搜索的字段必须从原始索引的映射中复制。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

`

 PUT product_percolate

 {

   "mappings": {

     "properties": {

       "query": {

         "type": "percolator"

       },

       "brand": {

         "type": "text",

          "fields": {

            "keyword": {

              "type": "keyword"

            }

          }

        },

        "model": {

          "type": "text",

          "fields": {

            "keyword": {

              "type": "keyword"

            }

          }

        },

        "price": {

          "type": "long"

        }

      }

    }

  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

让我们保存一个用户想要提醒的 query:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

`

 PUT product_percolate/_doc/user1_iphone_12

 {

   "query": {

     "bool": {

       "must": [

         {

           "term": {

             "brand.keyword": {

               "value": "Apple"

              }

            }

          },

          {

            "term": {

              "model.keyword": {

                "value": "iphone 12"

              }

            }

          },

          {

            "range": {

              "price": {

                "lte": 500

              }

            }

          }

        ]

      }

    }

  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

现在进行产品查询时,将不会返回任何结果,因为所有 iPhone 12 不低于 500 美元。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

`

 POST products/_search

 {

   "query": {

     "bool": {

       "must": [

         {

           "term": {

             "brand.keyword": {

               "value": "Apple"

              }

            }

          },

          {

            "term": {

              "model.keyword": {

                "value": "iphone 12"

              }

            }

          },

          {

            "range": {

              "price": {

                "lte": 500

              }

            }

          }

        ]

      }

    }

  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

上面的搜索将返回如下的结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

`

 {

   "took": 1,

   "timed_out": false,

   "_shards": {

     "total": 1,

     "successful": 1,

     "skipped": 0,

     "failed": 0

   },

    "hits": {

      "total": {

        "value": 0,

        "relation": "eq"

      },

      "max_score": null,

      "hits": []

    }

  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

上面的结果表明,没有一个产品满足我们的搜索条件。

让我们添加价格为 499 的新产品 iPhone 12:

1

2

3

4

5

6

POST product/_doc/prod104

{

  "brand": "Apple",

  "model": "iphone 12",

  "price": 499

}

不会发送自动通知,因为在索引文档时不会运行 percolate 查询。 percolate 查询必须手动运行。

Percolate query API

你可以通过两种方式执行 percolate query:

首先,你可以使用单个文档或多个文档作为输入运行 percolate,如下所示:

单个文档

1

2

3

4

5

6

7

8

9

10

11

12

13

GET product_percolate/_search

{

  "query": {

    "percolate": {

      "field": "query",

      "document": {

        "brand": "Apple",

        "model": "iphone 12",

        "price": 499

       }

     }

   }

 }

多个文档

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

`

 GET product_percolate/_search

 {

   "query": {

     "percolate": {

       "field": "query",

       "documents": [

         {

           "brand": "Apple",

           "model": "iphone 12 pro",

            "price": 600

          },

          {

            "brand": "Apple",

            "model": "iphone 12",

            "price": 499

          }

        ]

      }

    }

  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

你将收到类似于正常查询响应的响应,字段 _source 将显示匹配的查询,但字段 _percolator_document_slot 将显示在这种情况下多个文档中匹配的文档的位置。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

`

 {

   "took": 3,

   "timed_out": false,

   "_shards": {

     "total": 1,

     "successful": 1,

     "skipped": 0,

     "failed": 0

   },

    "hits": {

      "total": {

        "value": 1,

        "relation": "eq"

      },

      "max_score": 1.2615292,

      "hits": [

        {

          "_index": "product_percolate",

          "_id": "user1_iphone_12",

          "_score": 1.2615292,

          "_source": {

            "query": {

              "bool": {

                "must": [

                  {

                    "term": {

                      "brand.keyword": {

                        "value": "Apple"

                      }

                    }

                  },

                  {

                    "term": {

                      "model.keyword": {

                        "value": "iphone 12"

                      }

                    }

                  },

                  {

                    "range": {

                      "price": {

                        "lte": 500

                      }

                    }

                  }

                ]

              }

            }

          },

          "fields": {

            "_percolator_document_slot": [

              0

            ]

          }

        }

      ]

    }

  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

其次,你可以提供现有索引中的文档 ID,如下所示(目前不支持传递多个 ID):

1

2

3

4

5

6

7

8

9

10

GET product_percolate/_search

{

  "query": {

    "percolate": {

      "field": "query",

      "index": "product",

      "id": "prod104"

    }

  }

}

上面的查询的结果为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

`

 {

   "took": 7,

   "timed_out": false,

   "_shards": {

     "total": 1,

     "successful": 1,

     "skipped": 0,

     "failed": 0

   },

    "hits": {

      "total": {

        "value": 1,

        "relation": "eq"

      },

      "max_score": 1.2615292,

      "hits": [

        {

          "_index": "product_percolate",

          "_id": "user1_iphone_12",

          "_score": 1.2615292,

          "_source": {

            "query": {

              "bool": {

                "must": [

                  {

                    "term": {

                      "brand.keyword": {

                        "value": "Apple"

                      }

                    }

                  },

                  {

                    "term": {

                      "model.keyword": {

                        "value": "iphone 12"

                      }

                    }

                  },

                  {

                    "range": {

                      "price": {

                        "lte": 500

                      }

                    }

                  }

                ]

              }

            }

          },

          "fields": {

            "_percolator_document_slot": [

              0

            ]

          }

        }

      ]

    }

  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

如何将 Percolate 与你的应用程序集成

  • 如果你使用 Logstash 为数据编制索引,则可以使用 Elasticsearch 过滤器插件并运行过滤查询以查看传入文档是否与任何已保存的查询匹配。 如果是这样,你可以使用单独的输出插件向用户发送通知。
  • 如果自定义连接器用于数据索引,则 Elastic 客户端可用于运行 percolate query 并直接从连接器发送通知。

为什么要 percolate 而不是 watcher?

相对于percolate,watcher 不太适合需要实时匹配的场景。 是的,相比之下还有更多的争论空间,但暂时,我认为这不在本博客的范围之内。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 : https://juejin.cn/post/7192431517467934776
相关文章
  • java多线程实现同步锁卖票实战项目

    java多线程实现同步锁卖票实战项目
    同步概念与方法: 窗口类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Ticket implements Runnable{ int tickets=20;//总共20张票 @Override public
  • Elasticsearch percolate 查询示例介绍
    我们将文档索引到 Elasticsearch 中并对其运行查询以获得满足提供的搜索条件的文档。 我们构造一个匹配或术语查询作为输入,匹配查询的文
  • Java类的构造方法介绍

    Java类的构造方法介绍
    Java语言中,类的构造方法是一种很特殊的方法。关于构造方法要记忆和理解的知识点其实挺多的,下面我们就来详细的讲讲构造方法,相信
  • 基于EasyExcel实现百万级数据导入导出

    基于EasyExcel实现百万级数据导入导出
    在项目开发中往往需要使用到数据的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。 大数据的
  • Java使用Zxing二维码生成的代码
    1、二维码简介 二维条形码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编
  • Java经典面试题最全汇总208道(六)

    Java经典面试题最全汇总208道(六)
    短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天。
  • Spring中Bean注入源码介绍

    Spring中Bean注入源码介绍
    BeanDefinition和Bean 在Spring中Bean的注入涉及两部分: BeanDefinition Bean 两个对象存在先后顺序,先注入BeanDefinition之后才执行Bean对象的注入。 那
  • Java流程控制语句最全汇总(上篇)

    Java流程控制语句最全汇总(上篇)
    本章是关于Java流程控制语句的最全汇总,本篇为汇总上篇。 流程是人们生活中不可或缺的一部分,它表示人们每天都在按照一定的流程做事
  • Java流程控制语句最全汇总(中篇)

    Java流程控制语句最全汇总(中篇)
    本章是关于Java流程控制语句的最全汇总,本篇为汇总中篇。 流程是人们生活中不可或缺的一部分,它表示人们每天都在按照一定的流程做事
  • Mapper与Mapper.xml文件之间匹配的问题介绍

    Mapper与Mapper.xml文件之间匹配的问题介绍
    Mapper与Mapper.xml文件之间匹配问题 这里我们做一个实例 user实体类 1 2 3 4 5 6 public class User { private Integer id; private String username; private String pas
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计