使用Indextank搜索多个字段

时间:2012-08-18 18:06:00

标签: ruby-on-rails indextank

我正在为书籍编制索引并对书籍的不同字段进行文本搜索:

  • 标题
  • 作者
  • 图书摘要

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

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

-

以下是代码示例:

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 pourlapremièrefois...“,”docid“=>”book_502“,   “query_relevance_score”=> -2967.0}]

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

  

idx.search(“guerre”,:function => 1,:fetch =>'book_id'   )['结果']。map {| result |导致[ “文档ID”]}

     

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

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

1 个答案:

答案 0 :(得分:1)

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

在这个特殊情况下(书名,作者和摘要),我猜想书名和作者对于匹配比描述更“重要”。换句话说,如果用户的查询与书名匹配,那么它比仅匹配摘要的结果更好。如果是这种情况,以下是您可以为用户获得更多相关结果的方法(这是一项更多的工作,但通常是值得的。)

首先,您将索引分为3个单独的字段:

  1. name - 包含书名
  2. 作者 - 包含作者
  3. text - 包含书籍摘要,以及您可能想要的其他关键字 匹配
  4. 然后在搜索时,为了搜索所有字段,您将使用OR查询。但是,为了给标题和作者提供比摘要更多的权重,您的查询将如下所示(示例用户搜索“guerre”):

      

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

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

      

    名称:(太子)^ 6或作者:(太子)^ 5或文字:(太子)

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

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

    希望这有帮助!