Сфинкс правильно сопоставляет массив json со всеми значениями

Я пытаюсь сопоставить строки, которые имеют массивы json, которые содержат все заданные элементы.

Пример поиска предметов:

['gym', 'sofa']

Ожидаемые строки совпадают:

['gym', 'sofa']
['gym', 'sofa', 'bed']
['pool', 'gym', 'sofa']
['pool', 'gym', 'sofa', 'bed']

Не должно совпадать:

['pool', 'gym', 'bed']
['pool', 'sofa', 'bed']

Я храню элементы в тексте json, который индексируется как атрибут json.

Пример таблицы:

ID  ITEMS
1   {'items': ['gym', 'sofa']}
2   {'items': ['gym', 'sofa', 'bed']}
3   {'items': ['pool', 'gym', 'bed']}
4   {'items': ['pool', 'sofa', 'bed']}

Мой sphinx.conf что-то вроде:

source srcItems
{
type            = mysql

sql_host        = localhost
sql_user        = root
sql_pass        =
sql_db          = items
sql_port        = 3306    # optional, default is 3306

sql_query        = \
SELECT id, items \
FROM items

sql_attr_json        = items
}

index items
{
source          = srcItems
path            = /opt/local/var/sphinx/data/items
}

indexer
{
mem_limit        = 128M
}

searchd
{
listen          = 9312
listen          = 9306:mysql41
log             = /opt/local/var/sphinx/log/searchd.log
query_log       = /opt/local/var/sphinx/log/query.log
read_timeout    = 5
max_children    = 30
pid_file        = /opt/local/var/sphinx/log/searchd.pid
max_matches     = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old      = 1
workers         = threads # for RT to work
binlog_path     = /opt/local/var/sphinx/data
}

Я попытался использовать следующее безрезультатно:

SELECT id,
ALL(var='gym' AND var='sofa' FOR var IN items.items) as i
FROM items
WHERE i=1;

SELECT id,
ANY(var='gym' AND var='sofa' FOR var IN items.items) as i
FROM items
WHERE i=1;

Также пробовал следующее, которое возвращает неправильные результаты:

SELECT id,
ALL(var='gym' OR var='sofa' FOR var IN items.items) as i
FROM items
WHERE i=1;

SELECT id,
ANY(var='gym' OR var='sofa' FOR var IN items.items) as i
FROM items
WHERE i=1;

Я получил ожидаемые результаты, когда я сделал:

SELECT id,
IN(items.items, 'gym') AS gym,
IN(items.items, 'sofa') AS sofa
FROM offers
WHERE gym = 1 AND sofa = 1

Но это существенно замедляет запрос и значительно усложняет построение запроса.

Что я делаю неправильно?

Как правильно сделать этот запрос в Sphinx?

0

Решение

Я думаю

SELECT id FROM offers
WHERE items.items IN('gym')
AND items.items IN('sofa')

может работать. Если нет, попробуйте

SELECT id,
IN(items.items, 'gym')+IN(items.items, 'sofa') AS i
FROM offers
WHERE i = 2

иначе

SELECT id,
ANY(var='gym' FOR var IN items.items)+ANY(var='sofa' FOR var IN items.items) as i
FROM items
WHERE i=2;
0

Другие решения

Закончилось использованием:

SELECT id,
IN(items.items, 'gym') AS gym,
IN(items.items, 'sofa') AS sofa
FROM offers
WHERE gym = 1 AND sofa = 1

Он отлично работает, и дополнительное время не так уж сложно, и его можно уменьшить с помощью лучшего оборудования.

Спасибо

0

По вопросам рекламы [email protected]