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}"
                                })

そして、これが「孫子」の本孫子」で得た結果の例です。

著者名("tzu")を検索すると、本が返されます。

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

=> [{"text" => "L'art de la guerre Sun Tzu Youboox libres de droits Traduitpourlapremièrefois..."、 "docid" => "book_502"、 "query_relevance_score" =>-2967.0}]

しかし、本のタイトルの一部( "guerre")を検索しても、結果に本が表示されません。

idx.search( "guerre"、:function => 1、:fetch =>'book_id')['results']。map{| result | 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

「これらすべてのフィールドを同時に検索できるように書籍にインデックスを付ける正しい方法は何ですか?」という質問への回答として、フィールドを 1 つの「テキスト」フィールドに連結することが、これを実現する最も簡単な方法です。この方法の考えられる欠点の 1 つは、関連性 (結果の順序) に関して、書籍のタイトル、著者、および要約に等しい重みが与えられることです。

この特定のケース (書籍のタイトル、著者、および要約) では、書籍のタイトルと著者は、説明よりもマッチングにとって「重要」であると推測できます。つまり、ユーザーのクエリが本のタイトルと一致する場合は、要約のみが一致する場合よりも優れた結果になります。この場合、ユーザーにとってより関連性の高い結果を得る方法を次に示します (少し手間がかかりますが、多くの場合、それだけの価値があります)。

まず、3 つの個別のフィールドにインデックスを付けます。

  1. name - 書籍のタイトルが含まれています
  2. 著者 - 著者が含まれています
  3. テキスト - 書籍の概要と、一致させたい他のキーワードが含まれている可能性があります

次に、検索時にすべてのフィールドを検索するために、OR クエリを使用します。ただし、要約よりもタイトルと著者に重点を置くために、クエリは次のようになります (ユーザーが「guerre」を検索する例):

名前:(ゲレ)^6 OR 作者:(ゲレ)^5 OR テキスト:(ゲレ)

別の例として、ユーザーが「sun tzu」を検索した場合:

名前:(孫子)^6 OR 著者:(孫子)^5 OR テキスト:(孫子)

適切なフィールドのグループ化を維持するには、括弧が必要です。したがって、クエリ テンプレートは次のようになります (私の Ruby は錆びていることに注意してください)。

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

お役に立てれば!

于 2012-08-18T21:01:20.857 に答える