1

私はスフィンクスインデックスを持っていますschools、そして私がクエリをするとき、私はいつも同じ結果を同じ順序で受け取ります。ランク付け、並べ替え、一致の考えられるすべての組み合わせを試しましたが、常に同じ並べ替えが行われました。

私が取得している悪いデータのサンプルは以下のとおりです。

"albany high"

Albany Junior High School | Auckland, NZ | 2001 (shouldn't be first)
Albany High School        | Albany, NY   | 2001
South Albany High School  | Albany, OR   | 2001
Albany High School        | Albany, CA   | 1001 (shouldn't be last)

ご覧のとおり、最高ランクの学校は「アルバニー」という名前の都市になく、下位にある必要がありますが、最低ランクの「アルバニー高校」はそれよりも上位にランク付けされている必要があります。この問題は、多くの検索用語で再現されています。

Sphinxインデックスは次のようになります。

source schools : root
{
    sql_query = \
        SELECT schools.id, schools.name, schools.state, schools.country, schools.city, \
        (select COUNT(*) from user2school WHERE school_id = schools.id) as user_count \
        FROM schools

    sql_attr_uint       = user_count
}

index schools
{
    source                  = schools
    path                    = /var/db/sphinx/data/schools
    min_infix_len           = 3
    infix_fields            = name
}

結果を生成するコードは次のとおりです。

$sphinx->SetMatchMode(SPH_MATCH_EXTENDED);
$sphinx->SetRankingMode(SPH_RANK_WORDCOUNT);
$sphinx->SetSortMode(SPH_SORT_RELEVANCE);

$sphinx->SetFieldWeights(array(
    'id' => 0,
    'name' => 1000,
    'city' => 0,
    'state' => 0,
    'user_count' => 0
));

Sphinxにカスタムウェイトを認識させるにはどうすればよいですか?私が試したすべての組み合わせは失敗するようです。


編集:

これは、順序は同じですが、設定がまったく異なる別の例です。ここでオンにした唯一のオプションは次のとおりです。

$sphinx->SetRankingMode(SPH_RANK_SPH04);

結果:

"albany high"

Albany Junior High School | Auckland, NZ | 3 (still shouldn't be first)
Albany High School        | Albany, NY   | 3
South Albany High School  | Albany, OR   | 2
Albany High School        | Albany, CA   | 1 (still shouldn't be last)

ご覧のとおり、順序は同じです。これは、私が試したランク付け、並べ替え、および重み付けのすべての組み合わせで同じです。この問題をデバッグするために試すことができるものはありますか?

4

2 に答える 2

1

おそらく、アプリケーションの論理エラーです。SphinxはIDのリストを提供し、それを使用して元のデータベースからデータを取得します。たぶん、あなたはそれらの行を正しくソートすることはできません。

私はあなたのデータをテストRTインデックスに挿入しようとしました(文字列属性を含むので、データを見ることができました)

mysql> insert into rttest values (1,'Albany Junior High School','Auckland','NZ','Albany Junior High School, Auckland, NZ');
   ... etc ...

mysql> select * from rttest where match('albany high');
+------+--------+-----------------------------------------+
| id   | weight | value                                   |
+------+--------+-----------------------------------------+
|    2 |   3267 | Albany High School, Albany, NY          |
|    3 |   3267 | South Albany High School, Albany, OR    |
|    4 |   3267 | Albany High School, Albany, CA          |
|    1 |   1304 | Albany Junior High School, Auckland, NZ |
+------+--------+-----------------------------------------+
4 rows in set (0.15 sec)

mysql> select * from rttest where match('albany high') option ranker=sph04;
+------+--------+-----------------------------------------+
| id   | weight | value                                   |
+------+--------+-----------------------------------------+
|    2 |  12267 | Albany High School, Albany, NY          |
|    4 |  12267 | Albany High School, Albany, CA          |
|    3 |  10267 | South Albany High School, Albany, OR    |
|    1 |   6304 | Albany Junior High School, Auckland, NZ |
+------+--------+-----------------------------------------+
4 rows in set (0.00 sec)

mysql> select * from rttest where match('albany high') option ranker=wordcount;
+------+--------+-----------------------------------------+
| id   | weight | value                                   |
+------+--------+-----------------------------------------+
|    2 |      3 | Albany High School, Albany, NY          |
|    3 |      3 | South Albany High School, Albany, OR    |
|    4 |      3 | Albany High School, Albany, CA          |
|    1 |      2 | Albany Junior High School, Auckland, NZ |
+------+--------+-----------------------------------------+
4 rows in set (0.00 sec)

ランキングモードの変更は機能します。

于 2012-07-19T11:07:22.790 に答える
0

SetFieldWeightsの0は奇妙に見えます。重みを設定するフィールドのみをメモするか、デフォルトとして1を使用します。0で問題が発生するのではないかと思います。

この特定のケースには、SPH_RANK_SPH04が最も適していると思われます。

また、setSelectは必要ありません

于 2012-07-17T11:11:10.023 に答える