弹性搜索:“精确”这句话用通配符匹配(Elastic Search: “Exact” phrase

2019-10-21 08:22发布

我使用的弹性来搜索家谱数据库名称。 一个搜索的选项是“精确搜索”。 问题是,我的客户希望通配符在精确搜索是允许的,所以准确和不精确的区别是不准确的搜索将返回模糊匹配,而确切的应该返回精确短语使用通配符除外(不模糊的结果搜索)。

为了使通配符,搜索当前正在使用的查询字符串。 这就是精确搜索的格式:

{
  "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.”等。

文章来源: Elastic Search: “Exact” phrase matching with wildcards