我使用zend lucene进行搜索。 我使用该代码构建索引
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::text('word_id', $word['id']));
$boostField = Zend_Search_Lucene_Field::text('priority', $word['priority']);
$doc->addField($boostField);
$doc->addField(Zend_Search_Lucene_Field::unStored('description', $word['name'], 'UTF-8'));
$index->addDocument($doc);
使用该代码解析搜索字符串:
$query= str_replace(array('-','!','@','#','$','%','^','&','*','(',')'), ' ', $query);
$query = trim($query);
$words = explode(" ", $query);
unset($query);
$query = "";
foreach ($words as $word) {
$query.='(' . $word . '*)';
if ($word != end($words)) {
$query.=' AND ';
}
}
return $query;
使用该代码进行搜索:
try {
Zend_Search_Lucene::setResultSetLimit($limit);
$index = Zend_Search_Lucene::open($this->_indexPath);
} catch (Exception $e) {
return false;
}
try {
return $index->find($query, 'score', SORT_NUMERIC, SORT_DESC, 'priority', SORT_NUMERIC, SORT_ASC);
} catch (Exception $e) {
return false;
}
所以,我的问题 - 我在索引中有一些字段,如:nootebook的黑色包,nootebook的蓝色包,nootebook,nootebook apple。 例如我输入“笔记本”,我想在最佳结果中使用“nootebook,nootebook apple”。 但我有顶级成果袋!我做错了什么?从搜索字段开始,我需要做什么才能获得最近收盘位置的结果? 有可能的?
答案 0 :(得分:0)
我不知道任何直接处理此案例的Query
或Similarity
实现。
可能会使用SpanQuery
来完成类似的行为,但是没有能力匹配查询的开头。我遇到的解决方法是在您想要以这种方式搜索的字段的开头添加关键字,并使用该关键字搜索Span。所以,如果我索引:
xxxbeginxxx notebook apple
您可以使用SpanNearQuery搜索:
SpanNearQuery spanNear1 = new SpanNearQuery(new SpanQuery[] {
new SpanTermQuery(new Term("description", "xxxbeginxxx")),
new SpanTermQuery(new Term("description", "notebook"))},
10, true);
一种hacky解决方案。您必须处理以确保始终在索引时添加术语,并在显示给用户之前将其删除。
也许有人知道更好的方法,但我相信这应该能让你找到你想要的行为。