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";
}