0

我想使用 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

4

1 回答 1

0

实现您的用例的最佳方法是使用Percolate 查询

添加具有索引数据、映射、搜索查询和搜索结果的工作示例

索引映射:

{
  "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
          ]
        }
      }
    ]
于 2021-08-11T02:50:47.723 回答