【问题标题】:Searching on multiple fields with Indextank使用 Indextank 搜索多个字段
【发布时间】:2012-08-18 18:06:00
【问题描述】:

我正在索引书籍并在书籍的不同字段上执行文本搜索:

  • 标题
  • 作者
  • 书籍摘要

我尝试通过连接书名、作者姓名和书摘要来创建索引,但我的一些搜索没有返回预期的结果,我不明白为什么。

索引书籍以便我同时搜索所有这些字段的正确方法是什么?

--

这里是代码示例:

book_text_index = "#{book.name} #{book.author} #{book.summary}"

idx.document("book_502").add({  :text => book_text_index,
                                  :book_id => "#{book.id}",
                                  :name => "#{book.name}",
                                  :author => "#{book.author}",
                                  :summary => "#{book.summary}"
                                })

这是我为“Sun Tzu”的“L'art de la guerre”一书获得的结果示例

如果我搜索作者姓名(“tzu”),它会返回这本书:

idx.search("tzu", :function => 1, :fetch => 'text' )['results']

=> [{"text"=>"L'art de la guerre Sun Tzu Youboox libres de droits Traduit pour la première fois...", "docid"=>"book_502", "query_relevance_score"=>-2967.0}]

但如果我搜索书名的一部分(“guerre”),我不会在结果中找到这本书。

idx.search("guerre", :function => 1, :fetch => 'book_id' )['结果'].map { |结果|结果[“docid”]}

=> [“book_1962”,“book_1963”,“book_1951”,“book_1832”,“book_1812”, “book_1787”、“book_1775”、“book_1778”、“book_1730”、“book_1740”]

您可以看到 book_502 不在结果中。

【问题讨论】:

  • 您如何为 IndexTank 限制为每个文档 100k 的书籍编制索引?
  • 我们没有在 indextank 上索引这本书的内容,只有元数据。如果我必须索引内容,我会尝试使用 Apache Tika 来提取文本内容和 Amason 弹性搜索,但这是另一个问题。

标签: ruby-on-rails indextank


【解决方案1】:

在回答您的问题时,“索引书籍以便我同时搜索所有这些字段的正确方法是什么?” - 将字段连接成单个“文本”字段是实现这一目标的最简单方法。这种方法的一个可能的缺点是,对于相关性(结果的顺序),这给书名、作者和摘要赋予了同等的权重。

在这种特殊情况下(书名、作者和摘要),我猜想书名和作者在匹配方面比描述更“重要”。换句话说,如果用户的查询匹配书名,则比只匹配摘要的结果要好。如果是这种情况,您可以通过以下方法为您的用户获得更相关的结果(这需要更多的工作,但通常是值得的)。

首先,您索引到 3 个单独的字段:

  1. name - 包含书名
  2. 作者 - 包含作者
  3. text - 包含书籍摘要,可能还有您想要的其他关键字 匹配

然后在搜索时,为了搜索所有字段,您将使用 OR 查询。但是,为了让标题和作者比摘要更重要,您的查询将如下所示(例如用户搜索“guerre”):

姓名:(guerre)^6 OR 作者:(guerre)^5 OR text:(guerre)

另一个例子,如果用户搜索“sun tzu”:

姓名:(孙子)^6 或作者:(孙子)^5 或文字:(孙子)

括号是保持正确的字段分组所必需的。所以你的查询模板会是这样的(注意,我的 Ruby 已经生锈了):

searchify_query = "name:(#{user_query})^6 OR author:(#{user_query})^5 OR text:(#{user_query})"

希望这会有所帮助!

【讨论】:

  • 非常感谢,这正是我想要的。
猜你喜欢
  • 2011-09-03
  • 2012-10-29
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多