Php Sphinx将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

我试图匹配包含所有给定元素的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中进行此查询的正确方法是什么

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
它工作正常,额外的时间不是什么大问题,可以用更好的硬件来缓解

谢谢