我尝试执行一个Elasticsearch查询,我应该得到所有在餐厅名称中包含子字符串'pizz'但不包含'pizza'或'pizzeria'的餐厅。
我为此编写的查询是这样的:
GET my_index/_search
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"RestaurantName": {
"value": "*pizz*"
}
}
}
],
"must_not": [
{
"match": {
"RestaurantName": "pizza"
}
},
{
"match": {
"RestaurantName": "pizzeria"
}
}
]
}
}
}
这个查询匹配的字段像Instapizza
是错误的。它应该匹配任何组合或大写的情况下,如:Fozzie's Pizzaiolo
,PizzaVito
,Pizzalicious
.如何修复查询以丢失不需要的字段的匹配?对此有任何帮助都非常好。
1条答案
按热度按时间dluptydi1#
当您将'RestaurantName'作为文本字段索引时,“Standard”分析器包含小写过滤器,“lowercase”令牌过滤器使字段不区分大小写,这意味着lucene中的所有令牌都是小写的。
首先,您应该在RestaurantName字段中添加一个额外的关键字类型。
使用通配符搜索,
结果是,