【问题标题】:In elastic search how to query place name using fuzzy search在弹性搜索中如何使用模糊搜索查询地名
【发布时间】:2020-06-29 19:25:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: elasticsearch lucene fuzzy-search


    【解决方案1】:

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

    Reference

    模糊度参数可以指定为:

    0、1、2

    0..2 = 必须完全匹配

    3..5 = 允许一次编辑

    超过 5 = 允许两次编辑

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

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

    为什么 3:

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

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

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

    并且模糊查询是术语查询,它们不会被分析。将小写过滤器添加到 place 字段的分析器在这里无济于事。

    【讨论】:

    • 没有。模糊查询是术语查询。您可以使用模糊匹配查询来实现。
    【解决方案2】:

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

    这使用 Damerau-Levenshtein 距离来查找所有具有 最多两个更改,其中一个更改是插入、删除或 单个字符的替换,或两个相邻字符的换位 字符。

    详细解释请参考本官方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"
        }
      }
    ]
    

    【讨论】:

    • @rahul 你有机会看我的回答吗,期待得到你的反馈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多