3

私はSphinxを使用してWebサイトに検索を提供していますが、関連する結果を返すときに少し問題が発生しました。

質問を簡単にするために、@ titleと@bodyの2つのフィールドがあり、それぞれ100と15の重みが付けられていると仮定します。' in 'の単語のような小さな単語を検索するときは、その検索語の完全一致を上位にランク付けしてから、' in * | * in | * in * 'に一致するものチェックし、それらをわずかに低くランク付けします。検索にこのタイプの特異性を持たせる方法はありますか?

' in 'の結果の例:

  1. インド料理
  2. 真ん中
  3. ラテン語に関する文書

関連する設定は次のとおりです。

sphinx.conf

morphology              = stem_en
charset_type            = utf-8
min_word_len            = 2
min_prefix_len          = 0
min_infix_len           = 2
enable_star             = 1

search.php

$sp->SetMatchMode( SPH_MATCH_EXTENDED2 );
$sp->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
$sp->SetFieldWeights ( array('title' => 100, 'body' => 15) );

また、補足として、部分一致が検索結果に表示されない場合もあります。たとえば、Cowを検索しましたが、結果としてCowboyが表示されません。また、 CowbCowboを検索しましたが、 Cowboyと入力して初めて、期待どおりの結果が得られました。何かご意見は?


この質問は、この前のSOの質問と同じ線に沿っていますが、私の問題と解決策を保証しようとしたことについて、もう少し詳しく説明したいと思います。

4

2 に答える 2

3

形態学的にはカウボーイとは関係のない牛のように見えます。

あなたは2つの方法でそれを解決することができます:

  1. Cow>Cowboyでwordformsファイルを使用する
  2. スターが有効になっているので、クエリを「Cow」から「Cow *」に変更すると、「Cow」で始まるすべての単語が検索されます。

「in」と「in 」のランキングが異なる場合は、インデックスに2つのボディフィールドを含めることをお勧めします。たとえば、bodyフィールドのコンテンツが同じであるbodyとbody_starです。

search.phpで

$sp->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
$sp->SetMatchingMode( SPH_MATCH_EXTENDED2 );
$sp->SetFieldWeights ( array('title' => 20, 'body' => 15, 'body_start' => 5) );
$sp->Query("@body in @body_star *in* @title in");

これでうまくいくはずです。

于 2011-08-27T14:03:50.847 に答える
2

また、構成http://sphinxsearch.com/docs/1.10/conf-expand-keywords.htmlでexpand_keywordsオプションを 設定し、ランキングモードをSPH_RANK_SPH04http : //sphinxsearch.com/blog/2010/08/17/に設定することもできます。 how-sphinx-relevance-ranking-works /

于 2011-08-31T08:14:08.043 に答える