如何使用多字搜索查询自动完成/建议?

时间:2012-08-24 10:35:49

标签: zend-framework search autocomplete lucene

我正在使用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);

1 个答案:

答案 0 :(得分:2)

经过长时间的搜索,我得到了解决方案对于使用自动完成等应用程序,我们可以使用通配符查询和布尔查询。 如果搜索文本包含单个单词,则它始终与通配符查询一起使用[提供的搜索文本包含至少3个字符]但是如果我的搜索项具有&lt; 3个字符的通配符查询api不会工作。所以我在第65行修改了\ library \ Zend \ Search \ Lucene \ Search \ Query \ Wildcard.php上的代码。     private static $ _minPrefixLength = 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);