Выборка по тегам

MATCH('@title_prev "текст текст "/0.1 | @description "текст текст "/0.1')

Если верно, находим вхождение в двух полях, или или. Или в первом и во втором…

Пара вопросов

  • Как сделать, чтобы сортировка была в приоритете на первое поле?
  • В некоторых случаях, схожего контента 1-2 штуки, как ее дополнить по тегам. Поле у новости содержит id тегов, через запятую. Например 1,2,3,4, у тещей новости предположим ‘22,31,4,5’. Возможно ли выполнить поиск по тегам, имея две строки или необходимо при создании индекс приводить теги к какому та формату. К примеру для каждого тега отдельное поле и имя, если возможно то как. И будет ли сортировка в порядке приоритетов, образно 3 блока, в первом список сформированный по первому поли, второй блок по второму полю, а третий по тегам…
  • Как сделать, чтобы сортировка была в приоритете на первое поле?

Задать вес для него выше.

Возможно ли выполнить поиск по тегам

Вот это может помочь Manticore Search Manual: Functions > Arrays and conditions functions

SELECT * FROM indexnews WHERE tag ANY('1032','233')

Индекс содержит поле

    ["tag"]=> string(19) "17132,940,17494,901"

При выполнении запроса, пишет нет поля

Syntax error or access violation: 1064 table indexnews: unsupported column 'tag' (stored field, NOT attribute)

вам нужно создать атрибут tag если вы хотите фильтровать по нему Manticore Search Manual: Creating a table > Data types. У вас щас tag объявлен как полнотекстовое поле, по полнотекстовому полю нельзя фильтровать.

Есть новость, за ней закреплено 3 тега.
Их id 22,33,52 (содержимое поля)

Cоздаю индекс текущей таблицы…
Как быть когда необходимо, взять текущую строчку у записи22,33,52 и найти все записи в поле которых есть хотя бы один из id.

Может при создании индекса возможно создать несколько полей в которых по 1 id тега, какое то общее имя у все полей? Хз… Или поле будет содержать массив id, а в дальнейшем возможно выборку делать каким то образом…

Поиск по вхождению строки, это хорошо, но займет большее время…
Может найти вхождении 22 у 2322,3111,3

Вы прочитали про MVA и Manticore Search Manual: Functions > Arrays and conditions functions ?

SELECT * FROM `indexnews` WHERE all(tag) in ('18245','18244','9958') LIMIT 15
SELECT * FROM `indexnews` WHERE tag any('18245','18244','9958') LIMIT 15

Ничего не работает, пытаюсь найти вхождение в строчке. Хотя бы одно, не так чтобы все должны присутствует. Одни ошибки…

У меня работает:

mysql> drop table if exists indexnews; create table indexnews(tag string); insert into indexnews (tag) values('18245 smth_else'); SELECT * FROM `indexnews` WHERE tag any('18245','18244','9958') LIMIT 15;
--------------
drop table if exists indexnews
--------------

Query OK, 0 rows affected (0.01 sec)

--------------
create table indexnews(tag string)
--------------

Query OK, 0 rows affected (0.00 sec)

--------------
insert into indexnews (tag) values('18245 smth_else')
--------------

Query OK, 1 row affected (0.00 sec)

--------------
SELECT * FROM `indexnews` WHERE tag any('18245','18244','9958') LIMIT 15
--------------

+---------------------+-----------------+
| id                  | tag             |
+---------------------+-----------------+
| 1516152265172320261 | 18245 smth_else |
+---------------------+-----------------+
1 row in set (0.00 sec)
--- 1 out of 1 results in 0ms ---
1 Like

Как MVA тоже:

mysql> drop table if exists indexnews; create table indexnews(tag multi); insert into indexnews (tag) values((18245,99999)); SELECT * FROM `indexnews` WHERE any(tag) in (18245,18244,9958) LIMIT 15;
--------------
drop table if exists indexnews
--------------

Query OK, 0 rows affected (0.01 sec)

--------------
create table indexnews(tag multi)
--------------

Query OK, 0 rows affected (0.00 sec)

--------------
insert into indexnews (tag) values((18245,99999))
--------------

Query OK, 1 row affected (0.00 sec)

--------------
SELECT * FROM `indexnews` WHERE any(tag) in (18245,18244,9958) LIMIT 15
--------------

+---------------------+-------------+
| id                  | tag         |
+---------------------+-------------+
| 1516152265172320263 | 18245,99999 |
+---------------------+-------------+
1 row in set (0.00 sec)
--- 1 out of 1 results in 0ms ---
1 Like

У меня не работает…

Поле в индексе присутствует к примеру

 [comment] => 1
 [tag] => 1195,904

Fatal error : Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 table indexnews: unsupported filter on a ‘tag’ string column in

Тип поля, строчка, быть может в этом дело. Возможно в этом дело, в какой необходимо преобразовать?

Приведите полноценный пример, как не работает, начиная с create table, добавления туда документов и примера запроса, как у меня выше.

Если верно понимаю, при создании таблице, создается поле с типом multi?

Я не создаю таблицы, работаю с индексами. То есть мантикора парсит таблицу из mysql. Пока не уверен что будет толк, скажите пожалуйста.

Текущее тип поля в таблице, varchar. Точно ли тип поля должен быть таким или стоит присвоить тип поля один multy, если да, то какой именно. Их на скриншете несколько…

Мантикора при парсинге(создании таблицы), вероятно не верно индексирует данное поле. Из-за неверного выставленного типа в mysql…

Ради интереса попробовал
where FIND_IN_SET('333', tag)
Что та тоже не работает, на mysql именно так ищу запись в поле которой прописан id…

Если верно понимаю, при создании таблице, создается поле с типом multi?

Да. Команда create table indexnews(tag multi) создаёт таблицу с полем tag с типом multi.

Я не создаю таблицы, работаю с индексами

В мантикоре индексы - это:

  • полнотекстовый индекс
  • secondary index

Структуры, в которых хранятся данные называются “таблицами”. Раньше назывались “индексами”, но мы переименовали, чтоб не было путаницы с тем, что действительно индексы.

То есть мантикора парсит таблицу из mysql. Пока не уверен что будет толк, скажите пожалуйста

Не понял вопроса.

Мантикора при парсинге(создании таблицы), вероятно не верно индексирует данное поле. Из-за неверного выставленного типа в mysql…

Если вам в итоге нужно, чтоб данные попали в поле типа multi в мантикоре, то в mysql данные должны выглядеть как, например, строка. Вот пример:

snikolaev@dev2:~$ cat min_mysql_multi.conf
source min
{
	type = mysql
	sql_host = localhost
	sql_user = test
	sql_pass =
	sql_db = test
	sql_query = select 1, '(1,2)' m
        sql_attr_multi = uint m from field
}

index idx_min
{
	path = /tmp/idx
	source = min
}

searchd
{
        listen = 9315:mysql
        log = sphinx_min.log
        pid_file = 9315.pid
	binlog_path =
}

snikolaev@dev2:~$ indexer -c min_mysql_multi.conf --all
Manticore 6.3.9 1b26dba08@24120911 dev (columnar 2.3.1 edadc69@24112219) (secondary 2.3.1 edadc69@24112219) (knn 2.3.1 edadc69@24112219)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
Copyright (c) 2017-2024, Manticore Software LTD (https://manticoresearch.com)

using config file '/home/snikolaev/min_mysql_multi.conf'...
indexing table 'idx_min'...
collected 1 docs, 0.0 MB
creating secondary index
creating lookup: 0.0 Kdocs, 100.0% done
total 1 docs, 0 bytes
total 0.290 sec, 0 bytes/sec, 3.44 docs/sec
total 1 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
total 13 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
snikolaev@dev2:~$ searchd -c min_mysql_multi.conf
Manticore 6.3.9 1b26dba08@24120911 dev (columnar 2.3.1 edadc69@24112219) (secondary 2.3.1 edadc69@24112219) (knn 2.3.1 edadc69@24112219)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
Copyright (c) 2017-2024, Manticore Software LTD (https://manticoresearch.com)

[37:26.061] [3598479] using config file '/home/snikolaev/min_mysql_multi.conf' (334 chars)...
starting daemon version '6.3.9 1b26dba08@24120911 dev (columnar 2.3.1 edadc69@24112219) (secondary 2.3.1 edadc69@24112219) (knn 2.3.1 edadc69@24112219)' ...
listening on all interfaces for mysql, port=9315
precaching table 'idx_min'
precached 1 tables in 0.001 sec

snikolaev@dev2:~$ mysql -P9315 -h0 -e "select * from idx_min"
+------+------+
| id   | m    |
+------+------+
|    1 | 1,2  |
+------+------+

Что та тоже не работает, на mysql именно так ищу запись в поле которой прописан id…

Где вы в доке мантикоры увидели, что есть функция FIND_IN_SET ? Ссылку на доку на ANY/ALL я вам уже давал. Изучайте.

Все заработало, только

MATCH('@title_prev \"{$str}\"/0.1') AND any(tag) in ({$news['tag']})

Работает, вытаскивает если совпадение более 10% и есть совпадение в тегах

MATCH('@title_prev \"{$str}\"/0.1') OR any(tag) in ({$news['tag']})
MATCH('@title_prev \"{$str}\"/0.1') | any(tag) in ({$news['tag']})

Так ругается на синтаксическую ошибку.

Как выполнить, чтобы сперва вытаскивала по совпадению в имени, когда не будет совпадений, начать вытаскивать те записи в которых есть пересечение по тегам? Но не вытаскивать те записи, которые были ранее выданы по пересечению в имени.

Как выполнить, чтобы сперва вытаскивала по совпадению в имени, когда не будет совпадений, начать вытаскивать те записи в которых есть пересечение по тегам?

Сделать тэги полнотекстовым полем и использовать quorum / proximity / field weights / boost