我使用的弹性来搜索家谱数据库名称。 一个搜索的选项是“精确搜索”。 问题是,我的客户希望通配符在精确搜索是允许的,所以准确和不精确的区别是不准确的搜索将返回模糊匹配,而确切的应该返回精确短语使用通配符除外(不模糊的结果搜索)。
为了使通配符,搜索当前正在使用的查询字符串。 这就是精确搜索的格式:
{
"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
}
}
]
}
}
]
}
}
}
}
}
我有一个提升,这样完全精确的匹配首先返回,工作正常。 但是,我完全匹配后,我得到(使用玛丽C.为例)的结果,如“玛丽F.” 或“詹姆斯C.”。 我的客户不希望这样,因为它是不准确不够; 我应该只得到的结果与名玛丽三,或者,如果我搜索“三月* C”。 我应该得到“玛丽C.” 或“马丁C.”,但我不应该得到“詹姆斯C.” 或“玛丽F.”
我补充说:“default_operator”:“和”像这样的查询字符串:
{
"query_string": {
"query": "mary c.",
"default_field": "first_name",
"analyzer": "standard",
"fuzzy_min_sim": 0,
"boost": 0.5,
"default_operator": "AND"
}
}
这是更好的 ,但还是差了一点; 我现在只得到有“玛丽”和“C”的结果 在第一个的名字,但他们中的一些是“玛丽·简C.” 和“玛丽,詹姆斯·C的寡妇”
有没有什么办法可以让QUERY_STRING匹配更精确? 最起码,短语前缀应该匹配,所以“玛丽C.” 不应返回“玛丽,詹姆斯·C的寡妇” 但只有“玛丽C. ......”。 理想情况下,玛丽C.应该只匹配“玛丽C.” 和“三月* C”。 将匹配“玛丽三”,“马丁C.”等。