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;
        }

だから、私の問題-私は次のようないくつかのフィールドをインデックスに持っています:nootebook用の黒いバッグ、nootebook用の青いバッグ、nootebook、nootebook apple。たとえば、「notebook」と入力すると、「nootebook、nootebook apple」が上位の結果に表示されます。しかし、私はトップの結果にバッグを持っています! 私は何を間違っていますか?検索フィールドの開始からの最大クローズポジションの結果を得るために何をする必要がありますか? 可能です?

4

1 に答える 1

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

ハッキーな解決策のようなもの。用語が常にインデックス時に追加され、ユーザーに表示される前に削除されるようにする必要があります。

おそらく誰かがより良い方法を知っているでしょうが、私はそれがあなたが探している動作を得るはずだと信じています.

于 2013-04-01T04:45:11.550 に答える