Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Вопрос по работе со sphinx
цитата
05/10/15 в 09:41
 MilkSucker
Всем привет. Есть спецы по работе с ним?
Вопрос по Sphinx API for PHP.

В индексе лежит:
1 | teen anal
2 | teen masturbate
3 | anal fisting
4 | teen
5 | anal

ищем по "teen anal":
$cl->SetMatchMode( SPH_MATCH_ANY );
$result = $cl->Query("teen anal");

На выходе в результатах получаем только
1 | teen anal

Вопрос: как получить еще и
2 | teen masturbate
3 | anal fisting
4 | teen
5 | anal

- вроде же одно из слов содержится у элемента в индексе?
цитата
05/10/15 в 13:45
 Sterx
$result = $cl->Query("teen anal");
название индекса укажи, так
$result = $cl->Query("teen anal", "yourIndex");

мало инфы, конфиг сюда скинь
можно веса еще указать
Цитата:

$cl->SetFieldWeights(array ('keywords' => 10, 'title' => 20, 'description' => 10));
цитата
06/10/15 в 14:18
 IgorZ
Должно работать..

а если teen задать точно всех teen выдаст ?
цитата
19/10/15 в 13:40
 MilkSucker
Примерно вот такой конфиг:

source pictures : te_db
{
   sql_query = \
   SELECT \
      p.id, c.title category_title, GROUP_CONCAT(ch.name SEPARATOR ' ') names, GROUP_CONCAT(tags_names.name SEPARATOR ' ') tags, IF(p.is_animated=1, 'gif', '') gif, p.filename, p.source, p.item_weight, p.hash, p.added date, p.mime, 'picture' item_type \
   FROM \
      pictures p \
   LEFT JOIN categories c ON p.category_id=c.id \
   LEFT JOIN tags ON tags.item_id = p.id AND tags.item_type = 'picture' \
   LEFT JOIN tags_ids ON tags_ids.id = tags.tag_id \
   LEFT JOIN characters ch ON ch.id = tags_ids.tag_id AND tags_ids.tag_type = 'character' \
   LEFT JOIN tags_names ON tags_names.id = tags.tag_id AND tags_ids.tag_type = 'common' \
   WHERE p.status = 1 AND c.status IN(1,4,5) AND p.gallery_id IN (SELECT base_gallery_id FROM categories) \
   GROUP BY tags.item_id, p.id;

   sql_attr_string      = item_type
   sql_attr_float      = item_weight
   sql_attr_string      = hash
   sql_attr_string      = mime
   sql_attr_string      = date
   sql_attr_string      = category_title
   sql_attr_string      = names
   sql_attr_string      = tags
   
   sql_ranged_throttle   = 0
}

index pictures
{
   source         = pictures
   path         = /usr/local/var/data/pictures # Distribution Dependant, VALIDATE
   docinfo         = extern
   mlock         = 0

   morphology      = none
   index_exact_words    = 1
   min_word_len       = 2
   html_strip       = 1

}

получается ~100к вхождений
делаю вот такой поиск:


        $cl = new \Sphinx\SphinxClient();
        $cl->SetServer(SPHINX_IP, SPHINX_PORT );
        $cl->SetConnectTimeout(1);
        $cl->SetArrayResult (true);
        $cl->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
        $cl->SetMatchMode(SPH_MATCH_EXTENDED);
        $result = $cl->Query("detective", "pictures");

Ничего не находит. Делаю indexer --dump-rows, открываю результат, ручками ищу detective - все находит:


INSERT INTO rows_pictures VALUES ('526419', 'Detective Conan', 'Ran Mouri', '', '', '1465234%20-%20Detective_Conan%20Ran_Mouri%20Sonoko_Suzuki.jpg', '', '0', 'a43b12829c0c067bfc97af04ec6dabcb', '2014-10-24 05:52:22', 'jpg', 'picture');
INSERT INTO rows_pictures VALUES ('526593', 'Detective Conan', 'Ran Mouri', '', '', '1313029%20-%20Detective_Conan%20Ran_Mouri.jpg', '', '3', 'b3444ae8268748fc1b292e0ac89b69c5', '2014-10-24 06:42:16', 'jpg', 'picture');
INSERT INTO rows_pictures VALUES ('526595', 'Detective Conan', 'Ran Mouri', '', '', '1310998%20-%20Detective_Conan%20Ran_Mouri.jpg', '', '0', 'c07adc83a71cb9b574049ed21ad101c1', '2014-10-24 06:42:26', 'jpg', 'picture');

От чего такое может быть?
цитата
19/10/15 в 13:56
 Sterx
веса пробовал указывать?

$cl->SetFieldWeights(array ('category_title' => 100));

в запросе конфига вижу
c.title category_title,
names, tags

то есть поиск по категориям - тегам?
а сам title записи не задействован?
цитата
19/10/15 в 15:37
 MilkSucker
Sterx писал:
веса пробовал указывать?

$cl->SetFieldWeights(array ('category_title' => 100));


не, не помогло...

Sterx писал:

в запросе конфига вижу
c.title category_title,
names, tags
то есть поиск по категориям - тегам?
а сам title записи не задействован?


У каждой пикчи есть айди категории, заголовок категории идет в поле c.title.
А еще у каждой пикчи в отдельной таблице есть записи, типа,
tag_name1, item_id1
tag_name2, item_id1
tag_name3, item_id1

char_name1, item_id1
char_name2, item_id1
char_name3, item_id1
Они все собираются через concat_group в tags и names
цитата
19/10/15 в 15:50
 Sterx
тогда могу предположить что записи вида
1 | teen anal
2 | teen masturbate
3 | anal fisting
4 | teen
5 | anal
движку не нравятся, чисто тектовый формат поместить в индекс не вариант?
цитата
20/10/15 в 05:14
 MilkSucker

Типа, собрать все данные в одно поле и по нему поиск делать? Это имеешь в виду?
цитата
20/10/15 в 08:28
 Sterx
можно и так.
я не для сфинкса , а просто для полнотекстового поиска мускуля собирал такие солянки - desc+tags+cats - и по релевантности выдавал
цитата
20/10/15 в 09:46
 MilkSucker

А match against не сильно ли подгрузит сервер при большом количестве поисковых запросов?
цитата
20/10/15 в 12:26
 Sterx
сильно
цитата
21/10/15 в 09:24
 MilkSucker
Короче, все оказалось проще icon_smile.gif Трабла в конфиге была.
Конкретно с директивой sql_attr_string:
http://sphinxsearch.com/docs/current/conf-sql-attr-string.html
Код:
...
Starting from 2.0.1-beta string attributes can be used for sorting and grouping(ORDER BY, GROUP BY, WITHIN GROUP ORDER BY). Note that attributes declared using sql_attr_string will not be full-text indexed; you can use sql_field_string directive for that.

Неделя мучений, а надо было просто выспаться... facepalm.gif


Эта страница в полной версии