我正在使用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的查询?
谢谢!
答案 0 :(得分:5)
不幸的是,不是你希望实现它的方式:
Lucene支持单个和多个 字符通配符搜索内 单个术语(但不在短语内 查询)。
即使有可能,也许不是一个好主意:
通配符,范围和模糊搜索 查询可能会匹配太多条款。它 可能会导致难以置信的搜索 表现降级。
我想如果你坚持使用多个通配符就行了,那就是两个执行两个单独的搜索,一个用于每个通配符,并将结果捆绑在一起。