弹性搜索:与通配符匹配的“精确”短语

时间:2014-12-03 15:14:53

标签: elasticsearch match wildcard

我使用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."等

0 个答案:

没有答案