0

次のような構造を持つかなり大きなテーブル (〜 30M 行) がいくつかあります:
- item_id - uint
- item_text - varchar(255)
- user_id - uint

キーはなく、item_id と item_text が同じで user_id が異なるレコードを見つけることができます。

item_id, item_text, user_id   
3, text1, 5  
3, text1, 7
4, text2, 5

テキスト検索を行うために MySQL から Sphinx に移行しようとしていますが、次のように翻訳するにはどうすればよいでしょうか:
SELECT * FROM table WHERE user_id=123 AND item_text LIKE '%search_string%'. ?!

現在の sphinx 構成設定では、インデクサーがディスク容量を使い果たしています。

source items
{
    ...
    sql_query_pre = SELECT @id := 0
    sql_query     = SELECT @id := @id + 1, item_id, item_text, user_id FROM items
    sql_attr_uint = user_id
    sql_attr_uint = item_id
}

index items_index
{
    source         = items
    path           = ...
    enable_star    = 1
    min_prefix_len = 0
    min_infix_len  = 3
    min_word_len   = 3
}

各 item_id で見つかった user_id 値を格納するために sql_attr_multi を使用する方法はありますか?

ありがとう !

4

1 に答える 1

3

あなたができる、

source items {
    ...
    sql_query     = SELECT item_id, item_text, GROUP_CONCAT(user_id) AS user_id \
                     FROM items GROUP BY item_id ORDER BY NULL
    sql_attr_multi = uint user_id from field;
}

また、本当に min_infix_len かどうか自問してみてください。これにより、ディスク サイズが大幅に増加します (行が重複するよりもはるかに大きくなります)。または多分 dict=keywords を試してください

于 2013-02-08T19:08:29.133 に答える