Zend フレームワークを使用して Web サイトを操作しています。サイトで 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);