【问题标题】:Sphinx returns empty results狮身人面像返回空结果
【发布时间】:2018-05-22 04:38:49
【问题描述】:

我有一个使用 Sphinx 搜索引擎的项目。

问题是直接搜索(当用户输入他的查询并按下回车键时)效果很好,但是当我尝试实现自动完成时它返回零结果。

Sphinx 版本是 2.0.8(由于某些原因无法更新)。

我使用此代码进行自动竞争(取自here

<?php
$ln_sph = new PDO("mysql:host=127.0.0.1;port={$confs['port2']}",
            '',
            '',
            array
            (
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"  
            )
        );

$stmt = $ln_sph->prepare("SELECT * FROM ".implode(",", $used_indexes)." WHERE MATCH(':match') LIMIT 0,10 OPTION ranker=sph04");

$aq = explode(' ', $query);
if(mb_strlen($aq[count($aq) - 1]) < 3)
{
    $query = $query;
}
else
{
    $query = $query.'*';
}

$stmt->bindValue(':match', $query, PDO::PARAM_STR);         
$stmt->execute();
$products_ids = array();
foreach($stmt->fetchAll() as $data)
{
    //Reading data from sphinx              
}

如果我通过 mysql 直接从服务器连接到 Sphinx

mysql -P10006 --protocol=tcp

并执行相同的查询,例如:

SELECT * FROM `app_catalog_prod_suggests` WHERE MATCH('пирс*') LIMIT 0, 10 OPTION ranker=sph04;

它也可以正常工作。

来自sphinx.conf的索引

index app_catalog_prod_suggests {
    source=app_catalog_prod_suggests
    path=/path/to/index
    enable_star=1
    min_word_len=3
    min_prefix_len=3
    morphology=stem_ru,stem_en,soundex
    charset_type=utf-8
    html_strip=1
}

我做错了什么?

附:如果需要,我可以提供更多数据

UPD。搜索部分

searchd {
        listen=127.0.0.1:10005
        listen=127.0.0.1:10006:mysql41
        log=/path/to/log
        query_log=/path/to/querylog
        binlog_path = #
        pid_file=/path/to/pid
}

【问题讨论】:

  • 显示配置中的 searchd 部分和 $confs['port2'] 的值。运行脚本时是否看到任何警告或错误?
  • @Manticore-Sphinxnextgen 问题已更新。端口与 mysql 中的示例相同。没有错误或警告

标签: php pdo sphinx


【解决方案1】:

经过一些尝试,我找到了这种行为的原因。它不是在 Sphinx 中,而是在 PDO 中。

首先,我测试了查询是否正常工作,例如使用一些常量值 - пирс*。我很惊讶,Sphinx 给了我我需要的东西。

所以,问题不在于 Sphinx。但那在哪里呢?只有一行可以导致它 - $stmt-&gt;bindValue(':match', $query, PDO::PARAM_STR);

我已将bindValue 替换为bindParam,它开始处理任何查询。

我不知道这种行为的真正原因,如果有人能解释一下就好了

UPD

经过一些额外的测试,错误不在bindParambindValue,而是在参数名称中

【讨论】:

    【解决方案2】:

    我认为您必须使用该代码

    $indexes = 'simplecomplete';
    $query = trim($_GET['term']);
    
    $stmt = $ln_sph->prepare("SELECT * FROM $indexes WHERE MATCH(:match)  LIMIT $start,$offset OPTION ranker=sph04,field_weights=(title=100,content=1)");
    $stmt->bindValue(':match', $query,PDO::PARAM_STR);
        $stmt->execute();
    $rows = $stmt->fetchAll();
       $meta = $ln_sph->query("SHOW META")->fetchAll();
    foreach($meta as $m) {
        $meta_map[$m['Variable_name']] = $m['Value'];
    }
    

    数据库连接

    define ( "FREQ_THRESHOLD", 40 );
    define ( "SUGGEST_DEBUG", 0);
    define ( "LENGTH_THRESHOLD", 2 );
    define ( "LEVENSHTEIN_THRESHOLD", 2 );
    define ( "TOP_COUNT", 1 );
    define ("SPHINX_20",false);
    //database PDO
    $ln = new PDO( 'mysql:host=127.0.0.1;dbname=test_database;charset=utf8', 'root', '' );
    
    //Sphinx PDO
    $ln_sph = new PDO( 'mysql:host=127.0.0.1;port=9306' );
    

    【讨论】:

    • 正如我在回答中所写,问题出在参数名称中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多