当前位置: 首页 > 面试题库 >

在Elasticsearch中偏向于nGram的完全匹配

万嘉石
2023-03-14
问题内容

我正在尝试将字段映射为nGram和“精确”匹配,并使精确匹配首先出现在搜索结果中。这是对类似问题的解答,但我正努力使其工作。

无论我为“精确”字段指定什么提升值,每次都会得到相同的结果顺序。这是我的字段映射的外观:

"name" : {
    "type" : "multi_field",
    "fields" : {
      "name" : {
        "type" : "string",
        "boost" : 2.0,
        "analyzer" : "ngram"
      },
      "exact" : {
        "type" : "string",
        "boost" : 4.0,
        "analyzer" : "simple",
        "include_in_all" : false
      }
    }
  }

这就是查询的样子:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "fields":["name","name.exact"],
                    "query":"Woods"
                }
            }
        }
    }
}

问题答案:

multi_field映射是正确的,但是搜索查询需要像这样更改:

{
    "query": {
        "filtered": {
            "query": {
                "multi_match": { # changed from "query_string"
                    "fields": ["name","name.exact"],
                    "query": "Woods",
                    # added this so the engine does a "sum of" instead of a "max of"
                    # this is deprecated in the latest versions but works with 0.x
                    "use_dis_max": false
                }
            }
        }
    }
}

现在,结果将“精确”匹配考虑在内,并加总得分。



 类似资料:
  • 问题内容: 我对使用ngram的单词有部分匹配。如何修改映射以始终偏爱精确匹配而不是ngram令牌?我不想修改查询。一个搜索框将搜索多种类型,每种类型都有各自的字段。 例如,假设我正在搜索职位,一个人的标题为“现场工程师”,另一个人的标题为“引擎技术员”。如果用户搜索“引擎”,我希望ES将后者返回为更相关。 我几乎逐字使用此映射:例外:我使用的ngram的最小值为3,最大值为11,而不是边缘ngr

  • 问题内容: 我正在使用Elasticsearch,但有一段时间魔鬼般地要进行精确匹配。我已经尝试过match,query_string等的各种组合,但是我什么也没得到,或者得到了不好的结果。查询看起来像这样: 排序结果 我当然知道“狗”,“那只狗”和“狗”的得分相同,但是我需要弄清楚如何提高得分“狗”的精确匹配度。 我也试过 但这仍然给我 问题答案: 默认情况下,使用标准分析仪分析字段。如果您想检

  • 问题内容: 我正在尝试为最终用户提供搜索类型,这更像sqlserver。我能够为给定的SQL场景实现ES查询: 在ES中,我使用ngram tokenizer来达到预期的结果: 所以,如果我的文档行像 上面的查询只显示了两个文档,但是当我尝试输入Peter sims或Peter simson时,除非我输入Peter tomson robert sims或Peter tomson robert si

  • 问题内容: 这是一个分为两个部分的问题。 我的文档如下所示: 我的第一个问题是如何检索“ title” 恰好是 “ No Title”的所有文档。我不希望出现标题为“此文档没有标题”的文档。 我的第二个问题是如何检索“ URL” 恰好 出现在一长串URL中的所有文档。 我正在使用pyelasticsearch,但是在curl中使用通用答案也可以。 问题答案: 如果您存储了源代码(这是默认设置),则

  • 我使用elasticsearch查询带有模糊匹配的索引。我使用的是一个最小克长度为3的边缘ngram标记器。 但是,对于仅包含1或2个字符的查询,这不会返回任何结果。是否可以仅对这1个或2个字符进行精确匹配,但对具有3个或更多字符的查询使用边缘非负RAM? 这是我当前的elasticsearch索引映射: 要查询此索引,请求如下: 产生了大量的结果,但是像这样的请求 给出一个空集。理想情况下,如果

  • 我和ElasticSearch一起工作。当我执行此查询时: 我得到了我想要的(所有的结果,其中有参考黑莓,但不是Q10)。 但是,我想限制搜索的字段只限于“title”字段。例如,_source文档有标题、正文、标签等,我只想搜索标题。ElasticSearch“匹配”似乎很适合我... 虽然这只成功地搜索了标题,但它仍然返回标题中带有Q10的结果,这与上面的搜索不同。 我正在看比赛文档,但似乎不