我正在为书籍编制索引并对书籍的不同字段进行文本搜索:
我试图通过连接书名,作者姓名和书籍摘要来创建索引,但我的一些搜索没有返回预期的结果,我不明白为什么。
对书籍编制索引的正确方法是什么,以便我同时搜索所有这些字段?
-
以下是代码示例:
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不在结果中。
答案 0 :(得分:1)
在回答您的问题时,“对书籍编制索引的正确方法是什么,以便我同时搜索所有这些字段?” - 将字段连接成一个“文本” field是实现这一目标的最简单方法。这种方法的一个可能的缺点是,对于相关性(结果的顺序),这给予书名,作者和摘要相同的权重。
在这个特殊情况下(书名,作者和摘要),我猜想书名和作者对于匹配比描述更“重要”。换句话说,如果用户的查询与书名匹配,那么它比仅匹配摘要的结果更好。如果是这种情况,以下是您可以为用户获得更多相关结果的方法(这是一项更多的工作,但通常是值得的。)
首先,您将索引分为3个单独的字段:
然后在搜索时,为了搜索所有字段,您将使用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})"
希望这有帮助!