Elasticsearch with Tire:具有多个单词的edgeNgram

2024-03-09

假设我有 5 部影片:

  • 无太阳
  • Sansa
  • 这也是吗
  • 索尔·古德
  • 唯一的幸存者

我想实现一个具有以下预期行为的自动完成搜索字段:

  • “Sans” > 无太阳,珊莎
  • 《无忧无虑》> 无太阳
  • “所以” > 这也是,索尔·古德,唯一幸存者
  • “也是” > 这也是
  • 《索尔》> 索尔·古德,唯一幸存者,无太阳

这个用例似乎很明显,并且一定是许多人使用的一个,但我就是无法让它正常工作,而且我似乎找不到任何答案或文档来提供帮助。这是我当前的模型:

class Film < Media
  include Tire::Model::Search
  include Tire::Model::Callbacks

  settings  :analysis => {
              :filter => {
                :title_ngram  => {
                  "type"      => "edgeNGram",
                  "min_gram"  => 2,
                  "max_gram"  => 8,
                  "side"      => "front" }
              },
              :analyzer => {
                :title_analyzer => {
                  "tokenizer"    => "lowercase",
                  "filter"       => ["title_ngram"],
                  "type"         => "custom" }
              }
            } do
    mapping do
      indexes :title, :type => 'string', :analyzer => 'title_analyzer'
      indexes :int_english_title, :type => 'string', :analyzer => 'title_analyzer'
    end
  end
end

以及我的 search_controller 中如何处理查询:

search = Tire.search ['books', 'films', 'shows'], :load => true, :page => 1, :per_page => 10 do |s|
    s.query do |query|
        query.string "title:#{params[:search]}"
    end
end
@results = search.results

这会产生一些奇怪的行为:

  • “Sans so”按顺序返回“Sansa、Sans Soleil、So Is This”。
  • “So is”按顺序返回“Sol Goode、Sans Soleil、Sole Survivor、So Is This”。

我想你可能会实现你想要的match https://github.com/karmi/tire/blob/master/test/integration/match_query_test.rb查询设置为type:"phrase_prefix"。您的大多数(但不是全部)示例都可以。

使用 Ngram,您可以更好地控制流程,但它们有相当大的召回率(它们通常返回比您想要的更多的数据),您必须与之抗争。这就是您在多个查询术语(“Sans so”)中观察到的“奇怪行为”,因为它们实际上是作为Sans OR so query.

尝试使用default_operator: "AND"选项(参见轮胎的查询字符串测试.rb https://github.com/karmi/tire/blob/master/test/integration/query_string_test.rb),或者更确切地说match http://www.elasticsearch.org/guide/reference/query-dsl/match-query.html查询(参见轮胎的匹配查询测试.rb https://github.com/karmi/tire/blob/master/test/integration/match_query_test.rb)与operator: "AND" option.

有一些关于自动完成、Tire 和 Ngram 的文章:

  • http://dev.af83.com/2012/01/19/autocomplete-with-tire.html http://dev.af83.com/2012/01/19/autocomplete-with-tire.html
  • http://masonoise.wordpress.com/2012/08/11/elasticsearch-with-rails-and-tire/ http://masonoise.wordpress.com/2012/08/11/elasticsearch-with-rails-and-tire/
  • http://euphonious-intuition.com/2012/08/more-complicated-mapping-in-elasticsearch/ http://euphonious-intuition.com/2012/08/more-complicated-mapping-in-elasticsearch/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch with Tire:具有多个单词的edgeNgram 的相关文章

随机推荐

  • 有没有一种有效的方法来引用常量,而不是只读?

    我们来看下面的 C 代码 include
  • 与网络服务器同步核心数据

    我正在创建一个关于鸟类的应用程序 这个应用程序也应该在离线模式下工作 所以我决定使用核心数据 我计划有 1 个表 其中包含大约 700 条记录 所有鸟类都将显示在表格视图中 工作流程应该是这样的 用户启动应用程序 请求在后台发送到服务器 响
  • 如何使用批量更改壁纸

    我需要制作一个批处理文件 将壁纸更改为与bat文件位于同一位置的图片 我当前有以下代码 reg add HKCU Control Panel Desktop v Wallpaper f t REG SZ d c images wallpap
  • 哪一个更快? List.contains() 或 Map.containsKey()

    我正在编写一个算法 在其中寻找成对的值 这些值加在一起时会产生我正在寻找的另一个值 我发现使用Map将使我的算法速度从 O n 开始 后来我意识到我并没有真正使用我的Map so a List就足够了 我在谷歌上进行了强力搜索 但在我的问题
  • 如何在Sqlite3中将数组存储在一列中?

    有没有办法将整数数组存储在表的一列中 我想要这样的o p ident value count 563 0 10 0 0 1 100 2 200 3 300 4 400 5 500 6 我已经通过 postgres 实现了这
  • 为什么 SSL 握手会出现“无法生成 DH 密钥对”异常?

    当我与某些 IRC 服务器 但不是其他服务器 可能是由于服务器的首选加密方法 建立 SSL 连接时 出现以下异常 Caused by java lang RuntimeException Could not generate DH keyp
  • 使用 CSS 为黑色图标赋予另一种颜色

    我看到一些应用程序尽管包含黑色图标 但有些应用程序如何使用 CSS 将图标转换为不同的颜色 我似乎无法重复这个过程 这是我的 back css 文件 dashboard buttons a width 80px height 80px bo
  • Solr 搜索查询返回全头异常

    我正在 C 应用程序中调用托管在其他计算机上的远程 solr 搜索 现在 由于我的查询长度变得太大 因此搜索引擎返回全头错误 我无法减少查询长度 所以我只是想知道我可以提出同样的邮寄请求吗 我该怎么做这个 请建议我 谢谢 看起来您遇到了 j
  • 在回调中使用yield?

    我有一个函数y 这应该会产生一些记录 然而 该函数在回调中获取记录 并将其传递给另一个函数d 访问数据 d 不返回或产生任何东西 如果其他功能 这种模式是否可能d 接受回调被认为是黑匣子 替代设计是什么 function y d funct
  • 单元测试、NUnit 还是 Visual Studio? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在使用 Visual studio 有时是 resharper 来运行我的单元测试 我听说过 NUnit 但我对它了解不多 我应该关心它吗
  • 在 kubernetes pod 中获取日志的选项

    kubernetes pod 中的开发人员日志很少 获取日志供开发人员查看的最佳方法是什么 我们可以使用什么特定的工具 我可以选择graylog 但不确定是否可以对其进行定制以使开发人员登录到其中 最基本的方法是简单地使用kubectl l
  • Python:连接(或克隆)一个 numpy 数组 N 次

    我想通过克隆 Mx1 ndarray N 次来创建 MxN numpy 数组 有没有一种有效的 pythonic 方法来代替循环 顺便说一句 以下方法对我不起作用 X 是我的 Mx1 数组 numpy concatenate X numpy
  • 文件读取:feof() 用于二进制文件

    我正在读取一个二进制文件 当它到达终点时 看来它是由 feof 函数终止的 是因为二进制文件没有EOF字符吗 如果是这样我该如何解决它 目前我的代码正在使用 while 循环 while feof f 当它到达文件末尾位置 5526900
  • 为什么 lambda 的大小为 1 个字节?

    我正在使用 C 中的一些 lambda 表达式的内存 但我对它们的大小有点困惑 这是我的测试代码 include
  • 如何将 MemoryStream 中的 PDF 发送到 .Net 中的打印机?

    我使用 iTextSharp 在内存中创建了一个 PDF 并将其包含在 MemoryStream 中 我现在需要将 MemoryStream PDF 转换为打印机可以理解的内容 我过去曾使用报表服务器将页面呈现为打印机格式 但我无法将其用于
  • 从PowerShell 5.1到7.2.5 Get-Service -ComputerName不再存在,那么我如何获取计算机名称?

    我在用着Get Service显示过滤列表 它在 5 1 中运行良好 这就是我在 5 1 中的工作方式 Get Service DisplayName displayName ComputerName computers Sort Obje
  • 没有“提醒”的通知

    我正在尝试创建一个具有高优先级的通知 聊天应用程序 但我的客户要求它不会有 抬头 视图 我尝试过创建一个空布局RemoteViews设置为Notification headsUpContentView但还是什么都没有 这是我尝试过的 Int
  • 背景附件:修复了 translateX(0) 的断裂问题

    我有一个具有固定背景的滚动元素 my element background url foo png no repeat right bottom background attachment fixed 效果很好 通常情况下 但是 如果我对其
  • asp.net mvc 4通过按钮从控制器调用方法

    在我的控制器中 我有类 AccountController 并且在我有这个方法 HttpPost ValidateAntiForgeryToken public ActionResult LogOff WebSecurity Logout
  • Elasticsearch with Tire:具有多个单词的edgeNgram

    假设我有 5 部影片 无太阳 Sansa 这也是吗 索尔 古德 唯一的幸存者 我想实现一个具有以下预期行为的自动完成搜索字段 Sans gt 无太阳 珊莎 无忧无虑 gt 无太阳 所以 gt 这也是 索尔 古德 唯一幸存者 也是 gt 这也