Lucene中的多期通配符查询?

时间:2009-07-02 14:21:31

标签: php zend-framework full-text-search lucene

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

(注意:$ words是根据用户输入构造的数组。)

$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);

要做的是将 $ word 替换为($ word。'*') - 在结尾添加星号每个单词,把它变成一个通配符。

但是,$ multiq必须是 Zend_Search_Lucene_Search_Query_Wildcard 而不是 Zend_Search_Lucene_Search_Query_MultiTerm ,我不认为我仍然可以为每个添加多个Index_Terms的 $ multiq

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

谢谢!

1 个答案:

答案 0 :(得分:5)

不幸的是,不是你希望实现它的方式:

  

Lucene支持单个和多个   字符通配符搜索内   单个术语(但不在短语内   查询)。

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

  

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

我想如果你坚持使用多个通配符就行了,那就是两个执行两个单独的搜索,一个用于每个通配符,并将结果捆绑在一起。