指定されたすべての要素を含む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 でこのクエリを実行する正しい方法は何ですか?