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

如何构建elasticsearch查询,以使文档字段中的每个标记都匹配?

柯建修
2023-03-14
问题内容

我需要确保在用户搜索中,字段的每个标记至少与一个标记匹配。

为了简化起见,这是一个通用示例。

Store_Name = "Square Steakhouse"

当用户搜索Square或Steakhouse时,构建与该文档匹配的查询很简单。此外,在默认分析仪上附加了kstem过滤器后,牛排餐厅也很可能会匹配。

{
  "size": 30,
  "query": {
    "match": {
      "Store_Name": {
        "query": "Square",
        "operator": "AND"
      }
    }
  }
}

不幸的是,我需要匹配Store_Name字段的每个标记。我需要以下行为:

Query: Square Steakhouse    Result: Match
Query: Square Steakhouses   Result: Match
Query: Squared Steakhouse   Result: Match
Query: Square               Result: No Match
Query: Steakhouse           Result: No Match

综上所述

  • 这不是使用not_analyzed的选项,因为我确实需要利用分析器功能
  • 我打算使用kstem,自定义同义词,自定义char_filter,小写过滤器以及标准标记器

但是,我需要确保字段的每个标记都匹配

elasticsearch有可能吗?


问题答案:

这是个好方法。

它不是完美的,但是在简单性,计算和存储方面是一个很好的折衷。

  • 索引字段的令牌计数
  • 获取搜索文本的令牌计数
  • 执行过滤的查询并强制结果之间的令牌数相等

您将需要使用分析API来获取令牌计数。确保使用与所讨论字段相同的分析仪。这是一个VB.NET函数,用于获取令牌计数:

Private Function GetTokenCount(ByVal RawString As String, Optional ByVal Analyzer As String = "default") As Integer
    If Trim(RawString) = "" Then Return 0

    Dim client = New ElasticConnection()
    Dim result = client.Post("http://localhost:9200/myindex/_analyze?analyzer=" & Analyzer, RawString) 'Submit analyze request usign PlainElastic.NET API
    Dim J = JObject.Parse(result.ToString()) 'Populate JSON.NET JObject
    Return (From X In J("tokens")).Count() 'returns token count using a JSON.NET JObject

End Function

您将需要在索引时使用它来存储相关字段的令牌计数。确保在TokenCount的映射中有一个条目

这是一个很好的elasticsearch查询,用于利用此新令牌计数信息:

{
  "size": 30,
  "query": {
    "filtered": {
      "query": {
        "match": {
          "MyField": {
            "query": "[query]",
            "operator": "AND"
          }
        }
      },
      "filter": {
        "term": {
          "TokenCount": [tokencount]
        }
      }
    }
  }
}
  • 将[query]替换为搜索字词
  • 将[tokencount]替换为搜索字词中的令牌数量(使用上面的GetTokenCount函数

这样可确保所有匹配项至少与中的令牌数一样多MyField

上面有一些缺点。例如,如果我们匹配字段“ blue red”,并且用户搜索“ blue
blue”,则上面的内容将触发匹配。因此,您可能需要使用唯一的令牌过滤器。您可能还希望调整过滤器,以便

参考

  • 克林顿·戈麦利(Clinton Gormely)启发了解决方案


 类似资料:
  • 本文向大家介绍MongoDB查询以公式更新集合中文档的每个字段,包括了MongoDB查询以公式更新集合中文档的每个字段的使用技巧和注意事项,需要的朋友参考一下 要使用公式更新集合中文档的每个字段,请使用MongoDB update()。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是使用公式更新集合中文档的每个字段的查询- 在find()

  • 问题内容: 我想获取与“ statusCode”不匹配的结果:200 为了匹配字段中的文本,您可以使用 我尝试过这样的事情: 根据:https : //www.elastic.co/guide/zh- CN/elasticsearch/reference/current/query-dsl-bool- query.html 问题答案: 试试这个

  • 我希望得到与“StatusCode”不匹配的结果:200 为了匹配您使用的字段中的文本 我试过这样的方法: 根据:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

  • 我有多个mongodb文档,其中有一些不同的字段,但有一个相同的字段名作为标识符。如何使用同一字段查询不同的文档?例如,以下文档都有一个“name”字段,但没有其他公共字段。 如果我想询问所有23岁的男性,我会怎么做?以下代码不返回任何内容,因为没有包含这两个字段的文档。相反,有两个单独的文档,每个文档都有一个匹配字段。

  • 尝试获取与字段ABC的值相匹配的文档。尝试了“必须”或“应该”查询,但未得到预期结果。有人能建议我应该尝试什么样的查询吗?使用HighLevelRestClient。 或 映射 条件工作正常。如果我只是反转条件并忽略字段值,那么我就会得到结果。 X1和Y1是精确的字段值(想想枚举) Still query返回所有文档。这应该已将文档筛选为匹配的值 样本文档

  • 我是Elasticsearch的新手,我提出了一个问题,Elasticsearch嵌套查询是否只能为嵌套字段返回匹配的嵌套文档。 对于示例,我有一个名为的类型,其中嵌套字段名为 和嵌套查询 我需要的是搜索有提到足球的评论的博客文章,每个博客文章的评论数与足球相匹配(在例子中它数为1,因为另一个评论刚刚提到篮球)。 然而,Elasticsearch似乎总是返回完整的文档,所以我如何才能实现它,或者我