我们有一个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。我们尝试了不同类型的标记器,但没有任何帮助。
我们怎样才能达到预期的搜索结果?
我通过删除与此正则表达式匹配的所有内容来解决该问题:
[.,'\"\-+:~\^!?*\\]
在构建索引时以及在搜索时执行删除操作。