0

저는 ZF2 Search Lucene을 사용하여 사이트에서 제품을 검색합니다. 사용자의 입력 텍스트를 사용하여 제품을 검색하고 ID로 범주 및 유형과 같은 여러 매개 변수로 결과를 필터링해야합니다. 그러나 catch는 모든 필드에서 사용자의 입력이 검색되므로 필드에서만 을 검색해야합니다. 검색을위한Zend Lucene은 필터가있는 지정된 필드에서만 검색합니다.

$index = Lucene::create('./data/index'); 

    $products = $this->getEntityManager()->getRepository('Application\Entity\Product')->findAll(); 

    foreach ($products as $product) { 
     echo "Adding ".$product->getName(). " to index\n"; 
     $doc = new LuceneDocument(); 

     $doc->addField(LuceneDocument\Field::keyword('type', 'product')); 
     $doc->addField(LuceneDocument\Field::keyword('product_id', (string)$product->getId())); 
     $doc->addField(LuceneDocument\Field::keyword('category_id', (string)$product->getCategory()->getId())); 

     $fieldName = LuceneDocument\Field::text('product_name', $product->getName()); 
     $fieldName->boost = 2.0; // Field weight 
     $doc->addField($fieldName); 

     $fieldDescription = LuceneDocument\Field::unStored('product_description', $product->getDescription()); 
     $fieldDescription->boost = 1.0; // Field weight 
     $doc->addField($fieldDescription); 

     $index->addDocument($doc); 
    } 

    $index->commit(); 

코드 : 여기

인덱스에 제품을 추가하는 코드이다

$userQueryString = 'search input query string'; 
    $userQuery = LuceneSearch\QueryParser::parse($userQueryString); 
    // how to limit userQuery to search only in specific fields? 

    $typeTerm = new LuceneIndex\Term('product', 'type'); 
    $typeQuery = new LuceneSearch\Query\Term($typeTerm); 

    $categoryTerm = new LuceneIndex\Term(5, 'category_id'); 
    $categoryQuery = new LuceneSearch\Query\Term($categoryTerm); 

    $query = new LuceneSearch\Query\Boolean(); 
    $query->addSubquery($typeQuery, true /* required */); 
    $query->addSubquery($categoryQuery, true /* required */); 
    $query->addSubquery($userQuery, true /* required */); 

    $index = Lucene::open('./data/index'); 
    $hits = $index->find($query); 

    foreach ($hits as $hit) { 
     echo "Type: ".$hit->type."\n"; 
     echo "Id: ".$hit->product_id."\n"; 
     echo "Name: ".$hit->product_name."\n"; 
     echo "Category: ".$hit->category_id."\n"; 
     echo "\n"; 
    } 

답변

0

문서 스탠드 그

자바 루씬에서 첫 번째와 가장 큰 차이 그 용어는 모든 필드을 통해 검색됩니다.

당신이 LuceneSearch\QueryParser::parse() 방법을 사용하려는 경우,이 같은 $userQueryString을 준비 할 수 있습니다 :

... 
$userQuery = new Zend\Search\Lucene\Search\Query\MultiTerm(); 
$userQuery->addTerm(new Zend\Search\Lucene\Index\Term($userQueryString, 'name')); 
$userQuery->addTerm(new Zend\Search\Lucene\Index\Term($userQueryString, 'description')); 
... 
$query->addSubquery($userQuery, true /* required */); 
:

$userQueryString = 'name:search input query string description:search input query string'; 

은 또한이 같은 Zend\Search\Lucene\Search\Query\MultiTerm::addTerm() 방법을 사용할 수 있습니다