【问题标题】:Does the match query return only results base on score?匹配查询是否只返回基于分数的结果?
【发布时间】:2015-09-30 10:11:26
【问题描述】:

您好,我有以下对象:

{
  type:'foo'
  users: [{id: MyId roles:['Admin','FooAdmin']}, 
            {id: MyId2 roles:['Admin']}]
}

我使用 bool 查询通过用户 ID 获取这些对象。使用以下术语:

'term': {
         'users.id': 'myId'
        }

它运行良好,除非 id 中包含大写字母。我搜索了一下,发现匹配查询作为替代:

{
 "query":
   {
    "match":
     {
      "users.userId":token._source.userId
     }
   }
}

到目前为止,它对我来说效果很好,因为它区分大小写。但最近我听说匹配查询只能获得“最佳结果”,这意味着只能获得最高分的结果。这是真的?我是否冒着无法通过匹配查询获得所有我想要的对象的风险?

【问题讨论】:

  • 您希望获得完全 id MyId 即类似于WHERE MyId2 = 'myId' 的SQL WHERE 子句的对象?

标签: javascript elasticsearch


【解决方案1】:

Match 查询获取查询字符串analyzes it,然后将分析的标记转换为 OR 查询。原因是它区分大小写是因为分析器中有一个lowercase filter。

这样的查询字符串

"brown dog"

会变成两个标记并小写,类似于

[brown] OR [dog]

这将根据这两个术语的相关性检索和排名结果。相关性公式本身很复杂,但您会得到所有结果,只是按相关性排序。

参数 minimum_should_match 例外,如果您设置此参数,您可以控制上述 OR 查询中必须匹配多少项才能使文档在结果集中。但是,这默认为 1,因此不会对您产生影响。

如果您想要精确的字符串匹配但在没有此标记化业务的情况下使用小写,您可以创建一个自定义分析器,将 KeywordTokenizer(基本上意味着没有标记器)和小写过滤器串在一起。

【讨论】:

  • 我想要的是你所描述但没有小写字母的东西。换句话说,我想要一个区分大小写的查询,并为我提供我在查询中输入的确切字符串的匹配项。可以通过匹配查询来完成吗? OR 查询可以变成 AND 查询吗?
  • 那么您只需将查询更改为 not_analyzed 即可完全禁用所有分析
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多