elasticsearch - 在ElasticSearch中如何过滤某些单词的结果集?

标签 elasticsearch

我是Elasticsearch的新手。我建立了一个包含不同电子产品及其附件的数据库。我试图从该数据库中使用项目名称搜索所有笔记本电脑,笔记本电脑和计算机。但是,它还返回一些配件,例如笔记本电脑背包或笔记本电脑 shell 等。我在查询中使用must_not子句,但它并不能真正消除不必要的结果。有人可以建议我做错了什么吗?还是应该改善下面列出的查询?

30 res = es.search( index=Index, body={
 31         "query": {
 32             "filtered": {
 33                 "query": {
 34                     "match_all": {}
 35                     },
 36                 "filter": {
 37                     "bool": {
 38                         "must": [
 39                             {
 40                                 "terms": {
 41                                     "name": [
 42                                         "laptop","notebook","computer"
 43                                         ],
 44                                     "execution" : "or"
 45                                     }
 46                                 }
 47                             ],
 48                         "must_not": [
 49                             {
 50                                 "term": {
 51                                     "name": "Backpack"
 52                                     }
 53                                 }
 54                             ]
 55                         }
 56                     }
 57                 }
 58             }
 59 
 60           })

提前致谢。
请注意,我正在尝试使用python和elasticsearch python库。

最佳答案

当您将文档放入索引时,ElasticSearch会将分析器应用于原始值,该值会将您的输入分成多个词项,并对其应用一些过滤器。似乎默认分析器也将lowercase token 过滤器应用于您的输入,因此结果 token 使用小写字母。您可以尝试像这样使用带有小写字母的查询

{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "must": [
                        {
                            "terms": {
                                "name": [
                                    "laptop",
                                    "notebook",
                                    "computer"
                                ],
                                "execution": "or"
                            }
                        }
                    ],
                    "must_not": [
                        {
                            "term": {
                                "name": "backpack"
                            }
                        }
                    ]
                }
            }
        }
    }
}

或者您可以尝试使用match查询代替term查询
{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "must": [
                        {
                            "terms": {
                                "name": [
                                    "laptop",
                                    "notebook",
                                    "computer"
                                ],
                                "execution": "or"
                            }
                        }
                    ],
                    "must_not": [
                        {
                            "match": {
                                "name": "Backpack"
                            }
                        }
                    ]
                }
            }
        }
    }
}

第二个选项可能会稍微慢一些,但是如果您的关键字不是标记词,这将为其他输入提供预期结果

关于elasticsearch - 在ElasticSearch中如何过滤某些单词的结果集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43216426/

相关文章:

elasticsearch - 如何将脚本化度量标准中的Elasticsearch字段的类型从Long更改为Double?

amazon-web-services - 如何将日志从Lambda函数发送到Kibana

elasticsearch - 如何在elasticsearch simple_query_string中包含除空格以外的所有字符?

sql-server - 保持SQL Server数据库和Elasticsearch索引同步

elasticsearch - 有效地获取 Elasticsearch 索引中的所有文档

elasticsearch - 如何在 Elasticsearch 查询中使少量标记成为短语

elasticsearch - Elasticsearch没有可用的磁盘空间

elasticsearch - 如何在 Kibana Discovery 中使用斜杠 ('/' )?

elasticsearch - Elasticsearch 中的“出生日期”字段的部分日期搜索

elasticsearch - docker - 麋鹿 - vm.max_map_count