如何构建弹性搜索查询以使文档字段中的每个标记都匹配?

2024-03-04

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

这是为了简化起见的通用示例。

Let Store_Name = "Square Steakhouse"

当用户搜索 Square 或 Steakhouse 时,构建与此文档匹配的查询很简单。此外,通过将 kstem 过滤器附加到默认分析器,Steakhouses 也可能匹配。

{
  "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、小写过滤器以及标准分词器

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

这在弹性搜索中可能吗?


这里有一个好方法。

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

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

您将需要使用分析 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 的条目

这是一个很好的弹性搜索查询,用于利用这个新的令牌计数信息:

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

这确保了所有匹配项至少与中的标记一样多MyField.

上述方法也有一些缺点。例如,如果我们正在匹配字段“blue red”,并且用户搜索“blue blue”,则以上将触发匹配。所以,您可能想使用独特的令牌过滤器 http://www.elasticsearch.org/guide/reference/index-modules/analysis/unique-tokenfilter.html。您可能还希望调整过滤器,以便

参考

  • 克林顿·戈梅利提出了解决方案 https://groups.google.com/forum/?fromgroups=#!topic/elasticsearch/ttJTE52hXf8
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何构建弹性搜索查询以使文档字段中的每个标记都匹配? 的相关文章

随机推荐

  • 从相机捕获的iphone图像自动旋转Swift

    通过编程方式 我在应用程序中从相机捕获了图像 它已经很好地获取了 但是当我转移到另一个时 查看并忽略那个视图 当时我的图像我想旋转为风景 我用相机拍摄了图像 当我从照片库获取图像时 没有发现问题 下图是我的原图 截屏 https i sta
  • 如何将数据从一个 BigTable 表复制到另一个 BigTable 表

    我正在尝试将数据从一个 Bigtable 表复制到另一个 Bigtable 表 但没有找到任何直接的方法来执行此操作 可以选择将数据从 Bigtable 表复制到 Google Storage 然后从存储文件复制回 Bigtable 但这需
  • API方法排序:Swagger版本3.0.2

    我在用招摇版本3 0 2 http swagger io swagger ui 我也关注了这个答案 https stackoverflow com a 32345035 3006390但对方法顺序没有影响 window onload fun
  • 在 Spark 数据框中创建 StructType 的空列

    我需要将 StructType 的空列添加到现有的 DataFrame 中 尝试以下 df df withColumn features typedLit StructType Nil And df df withColumn featur
  • 对表单集中的每个表单进行重复查询

    在我的 Django 应用程序中 我的用户可以拥有多个职位 即 Position 模型有 User 模型的外键 通过使用 djangomodelformset factory我输出与当前登录用户关联的所有位置 如下所示 视图 py clas
  • 单步执行属性/函数 (F11) 无法按预期工作

    In Visual Studio 2010 the Step Into Property Function F11 doesn t work as expected 它不会进入属性设置器或获取器 我将解决方案转换为Visual Studio
  • 如何在 React App 中嵌入 Google 自定义搜索?

    我需要在 React 应用程序中嵌入 JS 小部件 有办法做到吗 JS 小部件是 Google 自定义搜索 function var cx 111 xxx var gcse document createElement script gcs
  • 在开发与生产版本中自动更改 Vite 代理位置?

    在我正在开发的单页应用程序中 我正在使用 Vite 并在我的vite config ts文件我有以下代理 proxy v1 target https 127 0 0 1 8080 changeOrigin true secure false
  • updatepanel中异步回发后如何在客户端推迟更新

    我有一个旧系统 它使用UpdatePanelsASP NET 的 之后postback完成后 我们知道里面UpdatePanel已更新 我可以在客户端以某种方式延迟此更新吗 那可能吗 所以就像 当postback启动后 我设置了一个java
  • MSMQ 与临时表转储

    我知道这个问题之前已经被问过 但环顾四周 我还是拿不定主意该走哪条路 以下是我的情况 希望对你有帮助 我们将提供一系列网络服务 数百个移动应用程序将按计划访问这些服务 这些服务将在设备上提供数据 并将新信息发送到设备并从设备返回 从设备返回
  • jQuery:从triggerHandler()接收额外参数

    span test span change function e console log e data triggerHandler change foobar 1 是我做错了还是有问题 谢谢 额外的数据作为参数传递给处理程序 span t
  • CoreNLP SemanticGraph - 搜索具有特定引理的边

    我正在使用斯坦福 CoreNLP 的依存解析器 并且想知道如何使用特定的头引理 从属引理和词汇关系对 SemanticEdge 进行通用搜索 例如 如果我有这样的实际依赖项 doobj 发现 4 见解 6 如何使用引理而不是字面单词和索引来
  • 如何将基于权重的累积趋势线添加到 R 的直方图中?

    在下面的直方图中添加累积趋势线时遇到了一些严重的问题 与我能找到的所有示例的主要区别在于 x 轴应该是距离的区间 但 y 轴是每个 bin 的 tonne km 总和 我为此使用重量 累积密度曲线应包括重量 吨 公里 为此随机生成一些数据
  • 在 ViewHolder 模式中将 ViewHolder 设置为静态对性能至关重要吗?

    将 ViewHolder 设置为静态对性能至关重要吗 ViewHolder模式 http developer android com training improving layouts smooth scrolling html View
  • 将一个函数绑定到kivy中的多个动态创建的按钮?

    Problem 我想创建多个按钮并将它们绑定到一个函数 问题是 每当我单击一个按钮时 该函数就会被多次调用 看来是事件连接的问题 当我查看按下按钮时调用该函数的实例时 似乎该函数立即从每个按钮调用 KV Code This is the b
  • IndexedDB:承诺升级?

    刚刚开始我的第一个项目 IndexedDb 我很难尝试创建一个在第一次使用时打开和升级数据库的系统 我想使用承诺 当前角Js q https code angularjs org 1 2 22 docs api ng service 24q
  • pthread_create 不带参数?

    我想创建一个没有函数参数的线程 但我不断收到严重困扰我的错误 因为我无法让一些超级简单的东西正常工作 这是我的代码 include
  • Spring Boot 2.1 中的 DataSource bean 重写

    我已经升级到 spring boot 2 1 版本 启动应用程序时出现奇怪的异常 无法注册在类路径资源 org springframework boot autoconfigure jdbc DataSourceConfiguration
  • Eclipse 类文件元数据

    在 Visual Studio 中 我可以通过按 F12 GoToDefinition 获取没有源代码 即捆绑在 DLL 内 的类中公开的公共方法 成员的简洁列表 同样 我正在学习 Android API 在 Eclipse 中 跳转到 A
  • 如何构建弹性搜索查询以使文档字段中的每个标记都匹配?

    我需要确保字段的每个标记与用户搜索中的至少一个标记相匹配 这是为了简化起见的通用示例 Let Store Name Square Steakhouse 当用户搜索 Square 或 Steakhouse 时 构建与此文档匹配的查询很简单 此