我是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库。
答案 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"
}
}
]
}
}
}
}
}
第二个选项可能会稍微慢一些,但如果您的关键字不是标记化术语,则会为其他输入提供预期结果