在弹性搜索中如何使用模糊搜索查询地名

In elastic search how to query place name using fuzzy search

我在弹性搜索中插入了位置,下面是示例弹性搜索存储位置:

[
  {
    "lat": 1,
    "lon": 1,
    "place": "asddda ddsd asdad vasanth hhjkhk sdsdd asddasd"
  },
  {
    "lat": 2,
    "lon": 2,
    "place": "asddda ddsd asdad vasanth1 hhjkhk sdsdd asddasd"
  },
  {
    "lat": 3,
    "lon": 3,
    "place": "asddda ddsd asdad vasanth2 hhjkhk sdsdd asddasd"
  },
  {
    "lat": 4,
    "lon": 4,
    "place": "asddda ddsd asdad test hhjkhk sdsdd asddasd"
  }
]

如果我搜索 vasanth 它给出了正确的结果,因为它应该给出所有 3 个结果。但是,如果我使用字符删除 Vsanth 进行搜索,它只会给出一个结果,但现在它也应该给出 3 个结果。而且,如果我插入一个字符,那么我也会。无法正常工作。

根据elasticsearch doc,模糊查询有以下特点:

Changing a character (box → fox)
Removing a character (black → lack)
Inserting a character (sic → sick)
Transposing two adjacent characters (act → cat)

下面是我正在使用的查询,

{
    "query": {
        "fuzzy": {
            "address": {
                "value": "Vsanth",
                "fuzziness":15,
                "transpositions":true,
                 "boost": 5
            }
        }
    }
}

那么,如何修改查询以使用模糊查询的所有四个功能。我不明白我犯了什么错误。

您可以使用“模糊”运算符在query_string中进行模糊搜索:

This uses the Damerau-Levenshtein distance to find all terms with a maximum of two changes, where a change is the insertion, deletion or substitution of a single character, or transposition of two adjacent characters.

详细解释可以参考这位官方documentation

添加一个工作示例,包括搜索查询和搜索结果,使用与问题中提到的相同的示例索引数据

搜索查询:

    {
  "query": {
    "query_string": {
      "query": "Vsanth~"
    }
  }
}

搜索结果:

"hits": [
  {
    "_index": "foo",
    "_type": "_doc",
    "_id": "1",
    "_score": 1.0033107,
    "_source": {
      "lat": 1,
      "lon": 1,
      "place": "asddda ddsd asdad vasanth hhjkhk sdsdd asddasd"
    }
  },
  {
    "_index": "foo",
    "_type": "_doc",
    "_id": "2",
    "_score": 0.8026485,
    "_source": {
      "lat": 2,
      "lon": 2,
      "place": "asddda ddsd asdad vasanth1 hhjkhk sdsdd asddasd"
    }
  },
  {
    "_index": "foo",
    "_type": "_doc",
    "_id": "3",
    "_score": 0.8026485,
    "_source": {
      "lat": 3,
      "lon": 3,
      "place": "asddda ddsd asdad vasanth2 hhjkhk sdsdd asddasd"
    }
  }
]

问题是你有更多的编辑距离来匹配 vasanth1 and vasanth2

Reference

The fuzziness parameter can be specified as:

0, 1, 2

0..2 = Must match exactly

3..5 = One edit allowed

More than 5 = Two edits allowed

并且您将模糊度指定为 15,因此只允许进行两次编辑,这是 es 中的最大值。

所以这里的问题是您的查询需要 3 个不支持的编辑距离。

为什么是 3:

Vsanth --> vsanth --> vasanth --> vasanth1

  1. 大小写更改 -> 大写 V 变为小写 v
  2. 添加一个->vasanth
  3. 再添加一个 -> vasanth1

因此您将获得唯一 vasanth 个匹配的文档。

而且模糊查询是term查询,不做分析。向您的 place 字段的分析器添加小写过滤器在这里无济于事。