我们有一个Accounts表,正在使用edgeNGram分析器对多个字段进行模糊查询来搜索相似的记录。我们的设置:
设置
{
settings: {
analysis: {
analyzer: {
edge_n_gram_analyzer: {
tokenizer: "whitespace",
filter: ["lowercase", "ednge_gram_filter"]
}
},
filter: {
ednge_gram_filter: {
type: "edgeNGram",
min_gram: 2,
max_gram: 10
}
}
}
}
}
映射
{
mappings: {
document_type: {
properties: {
uid: {
type: "text",
analyzer: "edge_n_gram_analyzer"
},
shop_name: {
type: "text",
analyzer: "edge_n_gram_analyzer"
},
seller_name: {
type: "text",
analyzer: "edge_n_gram_analyzer"
},
...
...
...
locale_id: {
type: "integer"
}
}
}
}
}
查询
{
body: {
query: {
bool: {
must: [
{
bool: {
should: [
{
fuzzy: {
uid: {
value: "antonline",
boost: 1.0,
fuzziness: 2,
prefix_length: 0,
max_expansions: 100
}
}
},
{
fuzzy: {
seller_name: {
value: "antonline",
boost: 1.0,
fuzziness: 2,
prefix_length: 0,
max_expansions: 100
}
}
},
{
fuzzy: {
shop_name: {
value: "antonline",
boost: 1.0,
fuzziness: 2,
prefix_length: 0,
max_expansions: 100
}
}
}
]
}
}
],
must_not: [
{
term: {
locale_id: {
value: 7
}
}
}
]
}
}
}
}
上面的示例查找“antonline”字符串的不同变体,例如“antonline”,“sanjonline”,“tanonline”,“kotonline”,“htonline”,“awmonline”。但是,它不匹配带有标点符号的字符串,例如antonline.com甚至不带点的antonlinecom。我们尝试了不同类型的 token 生成器,但无济于事。
我们如何才能达到预期的搜索结果?
最佳答案
我通过删除所有与此正则表达式匹配的东西解决了该问题:
[.,'\"\-+:~\^!?*\\]
在建立索引以及搜索时进行删除。