1

私が理解していることから、ドキュメント(特にスコアリング部分) を読んだ後、検索結果をスコアリングする際に、追加するすべてのフィールドの重要性は同じレベルです。私は次のコードを持っています:

protected static $_indexPath = 'tmp/search/indexes/projects';

public static function createSearchIndex()
{
    $_index = new Zend_Search_Lucene(APPLICATION_PATH . self::$_indexPath, true);

    $_projects_stmt = self::getProjectsStatement();
    $_count = 0;

    while ($row = $_projects_stmt->fetch()) {

        $doc = new Zend_Search_Lucene_Document();

        $doc->addField(Zend_Search_Lucene_Field::text('name', $row['name']));
        $doc->addField(Zend_Search_Lucene_Field::text('description', $row['description']));
        $doc->addField(Zend_Search_Lucene_Field::unIndexed('projectId', $row['id']));

        $_index->addDocument($doc);
    }

    $_index->optimize();
    $_index->commit();
}

コードは単純です。db から取得したデータに基づいてインデックスを生成し、指定した場所に保存します。

私の望ましい行動は、フィールドが(75%と25%としましょうname)よりも重要であるため、多くの場所を見ていました。descriptionしたがって、あるフレーズを検索すると、それが最初のドキュメントの説明と 2 番目のドキュメントの名前で見つかり、実際には 2 番目のドキュメントのスコアが 3 倍になり、リストの上位に表示されます。

この方法でスコアリング/順序付けを制御する方法はありますか?

4

1 に答える 1

1

このドキュメントページに基づいて見つけました。Similarity新しいアルゴリズム クラスを作成し、メソッドを上書きする必要がありますlengthNormDefaultこのメソッドをクラスからコピーし、$multiplier変数を追加し、必要に応じて値を設定しました (必要な列に対して):

class Zend_Search_Lucene_Search_Similarity_Projects extends Zend_Search_Lucene_Search_Similarity_Default
{
    /**
     * @param string $fieldName
     * @param integer $numTerms
     * @return float
     */
    public function lengthNorm($fieldName, $numTerms)
    {
        if ($numTerms == 0) {
            return 1E10;
        }

        $multiplier = 1;

        if($fieldName == 'name') {
            $multiplier = 3;
        }

        return 1.0/sqrt($numTerms / $multiplier);
    }
}

次に、必要な唯一のこと (質問からのコードの編集) は、Similarityインデックス作成の直前に新しいアルゴリズム クラスをデフォルト メソッドとして設定することです。

protected static $_indexPath = 'tmp/search/indexes/projects';

public static function createSearchIndex()
{
    Zend_Search_Lucene_Search_Similarity::setDefault(new Zend_Search_Lucene_Search_Similarity_Projects());

    $_index = new Zend_Search_Lucene(APPLICATION_PATH . self::$_indexPath, true);

    $_projects_stmt = self::getProjectsStatement();
    $_count = 0;

    while ($row = $_projects_stmt->fetch()) {

        $doc = new Zend_Search_Lucene_Document();

        $doc->addField(Zend_Search_Lucene_Field::text('name', $row['name']));
        $doc->addField(Zend_Search_Lucene_Field::text('description', $row['description']));
        $doc->addField(Zend_Search_Lucene_Field::unIndexed('projectId', $row['id']));

        $_index->addDocument($doc);
    }

    $_index->optimize();
    $_index->commit();
}

ブーストフィールドを追加したかっnameたのですが、誰でもできます。

于 2013-04-02T03:34:55.380 に答える