我使用Elastic在系谱数据库中搜索名称。搜索的一个选项是"精确搜索"。问题是我的客户希望在精确搜索中允许使用通配符,因此精确和不精确之间的区别在于不精确搜索将返回模糊匹配,而精确应该返回搜索的精确短语,但通配符除外(没有模糊结果) )。
为了启用通配符,搜索当前正在使用查询字符串。这是精确搜索的格式:
{
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"dis_max": {
"queries": [
{
"match": {
"first_name": {
"type": "phrase",
"query": "mary c.",
"fuzziness": 0,
"analyzer": "standard",
"boost": 2
}
}
},
{
"query_string": {
"query": "mary c.",
"default_field": "first_name",
"analyzer": "standard",
"fuzzy_min_sim": 0,
"boost": 0.5
}
}
]
}
}
]
}
}
}
}
}
我有一个提升,所以首先返回完全匹配的匹配,这很好。然而,在我的完全匹配之后,我得到(使用Mary C.作为例子)结果,如" Mary F。"或者"詹姆斯C."。我的客户不想要这个,因为它不够准确;我只能得到名字玛丽C.的结果,或者,如果我搜索" Mar * C。"我应该得到#14;玛丽C."或者"马丁C.",但我不应该得到"詹姆斯C."或者" Mary F。"
我添加了" default_operator":" AND"像这样的查询字符串:
{
"query_string": {
"query": "mary c.",
"default_field": "first_name",
"analyzer": "standard",
"fuzzy_min_sim": 0,
"boost": 0.5,
"default_operator": "AND"
}
}
更好,但仍然不太正确;现在我只得到了结果" Mary" AND" C。"在名字中,但其中一些是" Mary Jane C。"和玛丽,詹姆斯C的遗.."
有什么方法可以让query_string更准确地匹配?至少,短语前缀应该匹配,所以" Mary C。"不应该回归詹姆斯C的遗体玛丽。"但只有" Mary C. ...."。理想情况下,Mary C.应该只匹配" Mary C."和" Mar * C。"将匹配"玛丽C.","马丁C."等