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

时间:2017-04-04 19:50:11

标签: elasticsearch

我是elasticsearch的新手。我建立了一个不同电子产品及其配件的数据库。从该数据库我试图使用项目名称搜索所有笔记本电脑,笔记本电脑和计算机。然而,它还返回一些配件,如笔记本电脑背包或笔记本电脑外壳等。我在查询中使用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库。

1 个答案:

答案 0 :(得分:1)

当您将文档放入索引时,ElasticSearch会将分析器应用于strign值,这些值会将您的输入拆分为术语并对其应用一些过滤器。似乎默认分析器还将lowercase令牌过滤器应用于您的输入,因此结果令牌为小写。你可以尝试使用像这样的小写术语查询

{
    "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"
                            }
                        }
                    ]
                }
            }
        }
    }
}

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