Zend Lucene仅在指定字段中使用过滤器进行搜索


Zend Lucene search only in specified fields with a filter

我使用ZF2 Search Lucene搜索网站上的产品。我需要使用用户的输入文本搜索产品,并通过几个参数过滤结果,如类别和类型的id。但是问题是用户的输入会在所有字段中搜索,而我只需要在Name和Description字段中搜索

下面是向索引中添加产品的代码:

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

文档表明

与Java Lucene的第一个也是最重要的区别是默认情况下通过搜索所有字段

如果你想用LuceneSearch'QueryParser::parse()的方法,你可以这样制备$userQueryString:

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

也可以这样使用Zend'Search'Lucene'Search'Query'MultiTerm::addTerm()方法:

...
$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 */);