Sphinx Indexing User Data - PullRequest
       13

Sphinx Indexing User Data

0 голосов
/ 02 февраля 2020

Итак, у меня есть куча этих исходных конфигов в файле sphinx.conf , и они индексируются и работают нормально.

source company
{
    type            = mysql
    sql_host        = mysql
    sql_user        = root
    sql_pass        = root
    sql_db          = database_name
    sql_port        = 3306
    sql_query       = SELECT id, name FROM company
}
index company
{
    source          = company
    path            = /var/lib/sphinxsearch/data/company
    min_prefix_len  = 2
    morphology      = stem_en
}

Я пытаюсь создать такой, который будет индексировать набор всех имен друзей пользователя. Например:

users (id, name):
1 Tom
2 Dick
3 Harry
4 Jane

friends (id, user_a, user_b):
1 1 2
2 1 3
3 2 3
4 4 3

ВОПРОС

Как бы вы go написали запрос для индексации: 1. Друзья Тома: [Дик, Гарри] 2. Друзья Дика: [Том, Гарри] 3. Друзья Гарри: [Том, Дик, Джейн] 4. Друзья Джейн: [Гарри]

Так что, когда Гарри начинает печатать, чтобы искать имена своих друзей, он может найти только свои имена друзей в списке, и то же самое для всех других пользователей (должен быть в состоянии найти только собственные имена друзей). Спасибо.

1 Ответ

1 голос
/ 04 февраля 2020

Если у вас есть это в MySQL:

mysql> select * from users; select * from friends;
+------+-------+
| id   | name  |
+------+-------+
|    1 | Tom   |
|    2 | Dick  |
|    3 | Harry |
|    4 | Jane  |
+------+-------+
4 rows in set (0.00 sec)

+------+--------+--------+
| id   | user_a | user_b |
+------+--------+--------+
|    1 |      1 |      2 |
|    2 |      1 |      3 |
|    3 |      2 |      3 |
|    4 |      4 |      3 |
+------+--------+--------+
4 rows in set (0.00 sec)

Вы можете добавить следующее к вашему источнику:

sql_query_pre   = set @id=0;
sql_query       = select (@id:=@id+1) id, u.name user, (if(u.id=user_a,u3.name,if(u.id=user_b,u2.name,''))) friend from users u left join friends f on f.user_a = u.id or f.user_b = u.id left join users u2 on f.user_a = u2.id left join users u3 on f.user_b = u3.id
sql_field_string = friend

, что даст вам это:

mysql> set @id=0;select (@id:=@id+1) id, u.name user, (if(u.id=user_a,u3.name,if(u.id=user_b,u2.name,''))) friend from users u left join friends f on f.user_a = u.id or f.user_b = u.id left join users u2 on f.user_a = u2.id left join users u3 on f.user_b = u3.id;
Query OK, 0 rows affected (0.00 sec)

+------+-------+--------+
| id   | user  | friend |
+------+-------+--------+
|    1 | Tom   | Dick   |
|    2 | Tom   | Harry  |
|    3 | Dick  | Tom    |
|    4 | Dick  | Harry  |
|    5 | Harry | Tom    |
|    6 | Harry | Dick   |
|    7 | Harry | Jane   |
|    8 | Jane  | Harry  |
+------+-------+--------+
8 rows in set (0.00 sec)

Вот как это будет работать в Sphinx:

mysql> select friend from company where match('@user tom @friend di*');
+--------+
| friend |
+--------+
| Dick   |
+--------+
1 row in set (0.00 sec)

mysql> select friend from company where match('@user tom @friend ha*');
+--------+
| friend |
+--------+
| Harry  |
+--------+
1 row in set (0.00 sec)

mysql> select friend from company where match('@user tom @friend ja*');
Empty set (0.00 sec)

mysql> select friend from company where match('@user harry @friend ja*');
+--------+
| friend |
+--------+
| Jane   |
+--------+
1 row in set (0.00 sec)

Вас также может заинтересовать CALL SUGGEST / CALL QSUGGEST. Вот интерактивный курс по этому вопросу - https://play.manticoresearch.com/simpleautocomplete/

...