【问题标题】:ElasticSearch Blacklist (Subset Matching)ElasticSearch 黑名单(子集匹配)
【发布时间】:2021-10-14 11:08:30
【问题描述】:

我想使用 ElasticSearch 实现关键字黑名单。基本上我想创建一个不允许用户搜索的禁止查询列表。然后我希望能够传入一个检查过的查询并查看它匹配哪些被禁止的查询(如果有的话)。

如果被禁止的查询具有其关键字的子集,则已检查的查询与被禁止的查询匹配。为了说明,让我举个例子:

  • 禁止查询:
    • “黑人生活”
    • “黑人的命也是命”
    • 《黑色生活》 很重要”
    • “黑人的命也是命”
  • 已检查查询:“黑人生活 事”
  • 匹配:
    • “黑人生活”
    • “黑人的命也是命”

只有前两个被禁止的查询匹配,因为它们是检查查询的严格子集。第三个被禁止的查询不匹配,因为它使用“事项”,而不是“事项”。最后一个被禁止的查询不匹配,因为它不是“黑人的命也是命”的严格子集,因为它有一个额外的关键字“rulez”。

有人告诉我,实现这一点的最佳方法是渗透索引。我的问题是如何创建一个渗透查询来实现与检查查询(传入文档)的子集匹配?

这里是有关渗透查询的文档页面:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html

这是关于子集匹配的相关答案: https://discuss.elastic.co/t/subset-in-an-array/237459

【问题讨论】:

    标签: elasticsearch search elasticsearch-percolate


    【解决方案1】:

    实现您的用例的最佳方式是使用Percolate query

    添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例

    索引映射:

    {
      "mappings": {
        "properties": {
          "field": {
            "type": "text"
          },
          "query": {
            "type": "percolator"
          }
        }
      }
    }
    

    索引数据:

    {
      "query": {
        "match": {
          "field": {
            "query": "black lives matter rulez",
            "operator": "AND"
          }
        }
      }
    }
    {
      "query": {
        "match": {
          "field": {
            "query": "black lives matters",
            "operator": "AND"
          }
        }
      }
    }
    {
      "query": {
        "match": {
          "field": {
            "query": "black lives matter",
            "operator": "AND"
          }
        }
      }
    }
    {
      "query": {
        "match": {
          "field": {
            "query": "black lives",
            "operator": "AND"
          }
        }
      }
    }
    

    搜索查询:

    {
      "query": {
        "percolate": {
          "field": "query",
          "document": {
            "field": "black lives matter"
          }
        }
      }
    }
    

    搜索结果:

    "hits": [
          {
            "_index": "68734373",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.39229372,
            "_source": {
              "query": {
                "match": {
                  "field": {
                    "query": "black lives matter",
                    "operator": "AND"
                  }
                }
              }
            },
            "fields": {
              "_percolator_document_slot": [
                0
              ]
            }
          },
          {
            "_index": "68734373",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.26152915,
            "_source": {
              "query": {
                "match": {
                  "field": {
                    "query": "black lives",
                    "operator": "AND"
                  }
                }
              }
            },
            "fields": {
              "_percolator_document_slot": [
                0
              ]
            }
          }
        ]
    

    【讨论】:

    • @PrimeMover 请仔细阅读答案,如果这解决了您的问题,请告诉我?
    • @PrimeMover 你有没有机会浏览一下答案,期待得到你的反馈:-)
    • 我将此与我独立实现的另一种方法进行比较。我们会尽快回复您。
    • @PrimeMover 确定,等待您的回复:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多