0

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

  • 标题
  • 作者
  • 书籍摘要

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

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

--

这是代码示例:

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' )['results'].map { |result| 结果[“docid”]}

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

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

4

1 回答 1

1

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

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

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

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

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

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

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

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

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

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

希望这可以帮助!

于 2012-08-18T21:01:20.857 回答