【问题标题】:How to do query autocompletion/suggestions with multi-word search?如何使用多词搜索进行查询自动完成/建议?
【发布时间】:2012-08-19 22:05:58
【问题描述】:

我正在使用 zend 框架处理网站。我需要在我的网站中使用 zend lucene。我们有一个选项供用户搜索类别、项目等。

我们正在使用带有自动完成选项的 zend lucene。假设我有“iphone 3s”、“iphone 4s”、“iphone 5s”等项目。如果用户输入“iph”,我会得到搜索结果“iphone 3s”、“iphone 4s”、“iphone 5s”。目前,我在单字搜索方面取得了不错的结果。

我针对不同的搜索使用了不同查询构造 API 的组合。

对于单字搜索,我使用的是Zend_Search_Lucene_Search_Query_Wildcard,并且我得到了完美匹配的模式结果。对于多术语 我使用Zend_Search_Lucene_Search_Query_MultiTerm() 进行搜索,但仅在精确文本搜索的情况下才能获得结果。请一个 帮我整合这个功能?

通过使用Zend_Search_Lucene_Search_Query_Wildcard 来搜索单个术语,我得到了很好的结果,我需要同样的完美来进行多术语搜索。因为Zend_Search_Lucene_Search_Query_MultiTerm() 仅在精确搜索文本的情况下返回良好的结果,所以我不能使用自动完成选项。

我的搜索代码如下:

$searchfield = $searchtype."_name";//Like category_name
$searchfieldid = $searchtype."_id";//Like category_name
$res_table = "t_".$searchtype;  
$index = Zend_Search_Lucene::open(Zend_Registry::get('_datapath'));

/* Here we used different API for creating query for diffrent pattern
    1) Words < 3 chars(it wont work in wild cart
    2) Single word (pattern matching--wildcard)
    3) More than one word serach
*/
$res = explode(' ',$searchkey);
if(strlen($searchkey) <3) /*if key >=3 then only wildcard search works*/
{
    $term = new Zend_Search_Lucene_Index_Term($searchkey, $searchfield);
    $query = new Zend_Search_Lucene_Search_Query_Term($term);
}
else if(sizeof($res)==1) /*write condition for single word -->check sub str count*/
{   
    $searchkey1 = $searchkey."*";//car*
    $pattern = new Zend_Search_Lucene_Index_Term($searchkey1, $searchfield);
    $query = new Zend_Search_Lucene_Search_Query_Wildcard($pattern);
}
else
{ /*if more than one word comes use different query rather than wildcard query search*/
    $query = new Zend_Search_Lucene_Search_Query_MultiTerm();
    foreach($res as $key => $val)
    {
        /*  TRUE is used to define required term.
            FALSE is used to define prohibited term.
            NULL is used to define a term that is neither required nor prohibited.
            (here we  used last term as null and others are true*/
        if($key == (sizeof($res)-1))
            $signs = null;/*Last item is not a mandatory, so use null*/
        else
            $signs = true;
        $query->addTerm(new Zend_Search_Lucene_Index_Term($val,$searchfield), $signs);
    }
}   
$hits = $index->find($query);

【问题讨论】:

    标签: zend-framework search autocomplete lucene


    【解决方案1】:

    经过长时间的搜索,我得到了解决方案。对于使用自动完成等应用程序,我们可以使用通配符查询和布尔查询。 如果搜索文本包含单个单词,则它始终适用于通配符查询[提供的搜索文本包含至少 3 个字符] 但是如果我的搜索词具有

    对于多词搜索,我使用空格分割了单词并为每个单词创建了独立的通配符查询,并使用布尔(和)查询 api 我从通配符 api 加入了查询。这个对我有用。我的代码如下: [我的谦虚请求,如果我的代码对任何人有用,请投票给我]

                $index = Zend_Search_Lucene::open(Zend_Registry::get('_datapath'));
    
                $res                 =  explode(' ',$searchkey);            
                $query = new Zend_Search_Lucene_Search_Query_Boolean();
                foreach($res as $key    => $val)
                {
                    if(strlen($val)>0)//for wildcard queries atleast 1 items required
                    {
                        $searchkey1         = $val."*";//car*
                        $pattern            = new Zend_Search_Lucene_Index_Term($searchkey1, $searchfield);
                        $userQuery          = new Zend_Search_Lucene_Search_Query_Wildcard($pattern);
                        $signs              = true;                     
                        $query->addSubquery($userQuery, $signs /* required */);
                    }           
    
                }
    
            $hits       = $index->find($query);
    

    【讨论】:

    • 很好解释。我暂时不使用它,但对于我的网站,我将使用 Lucene 实现搜索。目前我正在为我的 zend 网站进行自动完成,可能会尝试你的方式。谢谢分享
    • 虽然我自己没有测试过,但我不鼓励修改“最少 3 个字母”的限制。我想它是为了防止服务器的工作量过多,所以如果你能避免这种情况。相反,我加载了一些用于 1 和 2 个字母自动完成/建议的简单数据(因为我可以提供简单的灯光示例),并且网页从 3 个字母请求服务器。
    猜你喜欢
    • 2021-01-10
    • 2020-07-07
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多