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