我想使用ElasticSearch实现关键字黑名单。基本上,我想创建一个被禁止的查询列表,用户是不允许搜索的。然后,我希望能够传递一个检查过的查询,并查看它与哪些禁用的查询匹配(如果有的话)。
如果禁用查询有其关键字的子集,则选中的查询与禁用查询匹配。为了举例说明,让我举一个例子:
只有前两个被禁止的查询匹配,因为它们是选中查询的严格子集。第三个被禁止的查询不匹配,因为它使用的是"matters",而不是"matter“。最后一个被禁止的查询不匹配,因为它不是“黑色生命重要”的严格子集,因为它有一个额外的关键字"rulez“。
有人告诉我,实现这个目标的最好方法是一个渗滤指数。我的问题是如何创建一个percolate查询来实现与检查的查询(传入的文档)的子集匹配?
下面是关于percolate查询的文档页面:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html
下面是有关子集匹配的相关答案:https://discuss.elastic.co/t/subset-in-an-array/237459
发布于 2021-08-11 02:50:47
实现用例的最佳方法是使用渗滤查询
使用索引数据、映射、搜索查询和搜索结果添加工作示例
索引映射:
{
"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
]
}
}
]
https://stackoverflow.com/questions/68734373
复制相似问题