2009-07-02 112 views
6

我正在使用Zend_Search_Lucene,Java Lucene的PHP端口。我目前有一些代码将根据字符串数组构建搜索查询,查找至少有一个索引字段与提交的每个字符串匹配的结果。简化的,它看起来像这样:Lucene中的多项通配符查询?

(注:$的话是从用户输入构造一个数组。)

$query = new Zend_Search_Lucene_Search_Query_Boolean(); 
foreach ($words as $word) { 
    $term1 = new Zend_Search_Lucene_Index_Term($word, $fieldname1); 
    $term2 = new Zend_Search_Lucene_Index_term($word, $fieldname2); 
    $multiq = new Zend_Search_Lucene_Search_Query_MultiTerm(); 
    $multiq->addTerm($term1); 
    $multiq->addTerm($term2); 
    $query->addSubquery($multiq, true); 
} 
$hits = $index->find($query); 

我会喜欢做的是与($替换$字 '*') - 在每个单词的末尾添加一个星号,将其变为通配术语。

但随后,$ multiq必须是一个Zend_Search_Lucene_Search_Query_Wildcard而不是Zend_Search_Lucene_Search_Query_MultiTerm,我不认为我会仍然能够多Index_Terms添加到每个$ multiq

有没有办法构建一个既是通配符又是MultiTerm的查询?

谢谢!

回答

5

不碍事,你希望实现它,可惜的是:

Lucene支持内 单条款单个和多个 字符匹配的(但不是内词组 查询)。

即使有可能,很可能不是一个好主意:

通配符,范围和模糊搜索 查询可以匹配太多的条款。它 可能会导致令人难以置信的搜索 性能降级。

我想象一下,如果你坚持使用多个通配符术语,将两个执行两个单独的搜索,每个通配术语一个,并将结果捆绑在一起。