2

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);
4

1 に答える 1

2

長い検索の後、私は解決策を得ました。オートコンプリートなどのアプリケーションを使用するために、ワイルドカード クエリとブール クエリを使用できます。検索テキストに単一の単語が含まれている場合、常にワイルドカード クエリで機能します [検索テキストに最低 3 文字が含まれている場合]。そこで、\library\Zend\Search\Lucene\Search\Query\Wildcard.php の 65 行目のコードを修正しました。

また、複数の単語を検索する場合は、スペースを使用して単語を分割し、単語ごとに独立したワイルドカード クエリを作成し、ブール (および) クエリ 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);
于 2012-09-02T10:19:24.193 に答える