0

我使用 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;
        }

所以,我的问题是——我在索引中有一些字段,例如:笔记本电脑的黑色袋子,笔记本电脑的蓝色袋子,笔记本电脑,笔记本苹果电脑。例如,我输入“笔记本”,我希望“笔记本,笔记本苹果”出现在最佳结果中。但我的包包名列前茅!我做错了什么?我需要做什么才能从搜索字段开始获得最大关闭位置的结果?有可能的?

4

1 回答 1

0

我不知道有任何Query直接Similarity处理这种情况的实现。

ASpanQuery可用于完成类似的行为,但无法匹配查询的开头。我想到的解决方法是在要以这种方式搜索的字段的开头添加一个关键字,然后使用该关键字搜索 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的解决方案。您必须确保始终在索引时添加该术语,并在您自己显示给用户之前将其删除。

也许有人知道更好的方法,但我相信这应该让你得到你正在寻找的行为。

于 2013-04-01T04:45:11.550 回答