Php Sphinx将json数组与所有值正确匹配
我试图匹配包含所有给定元素的json数组的行 搜索项目示例:Php Sphinx将json数组与所有值正确匹配,php,json,search,sphinx,sphinxql,Php,Json,Search,Sphinx,Sphinxql,我试图匹配包含所有给定元素的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
['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中进行此查询的正确方法是什么
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;
最终使用了:
SELECT id,
IN(items.items, 'gym') AS gym,
IN(items.items, 'sofa') AS sofa
FROM offers
WHERE gym = 1 AND sofa = 1
它工作正常,额外的时间不是什么大问题,可以用更好的硬件来缓解
谢谢