php - Zend Lucene search only in specified fields with a filter -
i utilize zf2 search lucene searching products on site. need search products using user's input text, , filter result several parameters such category , type id. grab user's input searched in fields, , need search only in name , description fields.
here's code adding products index:
$index = lucene::create('./data/index'); $products = $this->getentitymanager()->getrepository('application\entity\product')->findall(); foreach ($products $product) { echo "adding ".$product->getname(). " 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(); code searching:
$userquerystring = 'search input query string'; $userquery = lucenesearch\queryparser::parse($userquerystring); // how limit userquery search 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 $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"; }
the documentation stands
the first , important difference java lucene terms searched through all fields default.
if want utilize lucenesearch\queryparser::parse() method, can prepare $userquerystring this:
$userquerystring = 'name:search input query string description:search input query string'; also can utilize zend\search\lucene\search\query\multiterm::addterm() method this:
... $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 */); php zend-framework lucene zend-framework2 zend-search-lucene
No comments:
Post a Comment