Elasticsearch中带条件的子串匹配

vx6bjr1n  于 2023-04-20  发布在  ElasticSearch
关注(0)|答案(1)|浏览(110)

我尝试执行一个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 PizzaioloPizzaVitoPizzalicious .如何修复查询以丢失不需要的字段的匹配?对此有任何帮助都非常好。

dluptydi

dluptydi1#

当您将'RestaurantName'作为文本字段索引时,“Standard”分析器包含小写过滤器,“lowercase”令牌过滤器使字段不区分大小写,这意味着lucene中的所有令牌都是小写的。
首先,您应该在RestaurantName字段中添加一个额外的关键字类型。

{
    "mappings": {
        "properties": {
            "RestaurantName": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }
        }
    }
}

使用通配符搜索,

{
    "query": {
        "bool": {
            "must": [
                {
                    "wildcard": {
                        "RestaurantName.keyword": {
                            "value": "*Pizz*"
                        }
                    }
                }
            ],
            "must_not": [
                {
                    "match": {
                        "RestaurantName": "pizza"
                    }
                },
                {
                    "match": {
                        "RestaurantName": "pizzeria"
                    }
                }
            ]
        }
    }
}

结果是,

{
    "took": 8,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "pizza",
                "_type": "_doc",
                "_id": "1L6ob4cB6Rdc8HbDY8vi",
                "_score": 1.0,
                "_source": {
                    "RestaurantName": "Fozzie's Pizzaiolo"
                }
            },
            {
                "_index": "pizza",
                "_type": "_doc",
                "_id": "1b6ob4cB6Rdc8HbDg8tA",
                "_score": 1.0,
                "_source": {
                    "RestaurantName": "PizzaVito"
                }
            },
            {
                "_index": "pizza",
                "_type": "_doc",
                "_id": "1r6ob4cB6Rdc8HbDmMuJ",
                "_score": 1.0,
                "_source": {
                    "RestaurantName": "Pizzalicious"
                }
            }
        ]
    }
}

相关问题