Php zend lucene接近场地起点

Php zend lucene接近场地起点,php,zend-framework,lucene,indexing,full-text-search,Php,Zend Framework,Lucene,Indexing,Full Text Search,我使用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']);

我使用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;
        }
并使用该代码进行搜索:

 $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苹果。 例如,我输入“notebook”,我想在顶部结果中输入“nootebook,nootebook apple”。 但我有袋在顶级结果!我做错了什么?我需要做什么才能从搜索字段的开始处获得最大关闭位置的结果?
有可能吗

我不知道有任何
查询
相似性
实现直接处理这种情况

A可以用来完成类似的行为,只是没有能力匹配查询的开头。我想到的解决办法是在要以这种方式搜索的字段的开头添加一个关键字,然后用该关键字搜索一个范围。因此,如果我索引:

xxxbeginxxx notebook apple
您可以使用类似的搜索:

有点老套。您必须确保在索引时始终添加该术语,并在显示给用户之前删除该术语


也许有人知道一个更好的方法,但我相信这会让你得到你想要的行为。

你能解释一下“笔记本苹果”和“笔记本黑包”之间的逻辑区别是什么,只要与查询“笔记本”相关?在“笔记本苹果”中,“笔记本”一词是靠近左边的max。在“黑色笔记本包”中,“笔记本”一词远离左侧。我想做搜索,什么将是基于如何接近左边的话。见Zend的。查询解析器创建此类查询,如:
“xxxbeginxxx笔记本”~10
$查询.=''“.”xxxbeginxxx$words[0]。''.~10';foreach($words作为$word){if($word!=$words[0]){$query.=''''.$word.'';}if($word!=end($words)){$query.='和';}}返回$query;代码我不知道如何在somments中发布代码。我试着使用“xxxbeginxxx术语”~10,但我的搜索lucene只会随着exeption和所有东西而消亡。如果xxxbeginxxx是一个抽象的东西,我需要写什么——我不知道我在回答中说了什么,
xxxbeginxxx
不是自动提供的东西。您必须手动将其添加到要以这种方式搜索的每个字段中。不过,我不确定您为什么会因为以任何方式传入该查询而得到异常。关于您正在获取的异常的一些信息可能会有所帮助,但除非您将该术语添加到索引中进行搜索,否则它将无法工作。