在弹性搜索中如何使用模糊搜索查询地名
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
。
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
- 大小写更改 -> 大写 V 变为小写 v
- 添加一个->vasanth
- 再添加一个 -> vasanth1
因此您将获得唯一 vasanth
个匹配的文档。
而且模糊查询是term查询,不做分析。向您的 place
字段的分析器添加小写过滤器在这里无济于事。
我在弹性搜索中插入了位置,下面是示例弹性搜索存储位置:
[
{
"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
。
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
- 大小写更改 -> 大写 V 变为小写 v
- 添加一个->vasanth
- 再添加一个 -> vasanth1
因此您将获得唯一 vasanth
个匹配的文档。
而且模糊查询是term查询,不做分析。向您的 place
字段的分析器添加小写过滤器在这里无济于事。