4

django haystackを使用して、検索システムをdjangoプロジェクトに実装しています。問題は、モデルの一部のフィールドにフランス語のアクセントがあることです。アクセントのある場合とない場合のクエリの内容を含むエントリを見つけたいと思います。

アクセントのあるフィールドとアクセントのない同じフィールドの両方を使用してSearchIndexを作成するのが最善のアイデアだと思います。

これに関するアイデアやヒントはありますか?

ここにいくつかのコードがあります

次のモデルを想像してみてください。

Cars(models.Model):
    name = models.CharField()

および次のHaystackインデックス:

Cars(indexes.SearchIndex):
    name = indexes.CharField(model_attr='name')
    cleaned_name = indexes.CharField(model_attr='name')

    def prepare_cleaned_name(self, object):
        return strip_accents(object.name)

今、私のインデックステンプレートに、両方のフィールドを入れました:

{{ object.cleaned_name }}
{{ object.name }}

だから、それはいくつかの擬似コードです、それが機能するかどうかはわかりませんが、これについて何か考えがあれば、私に知らせてください!

4

3 に答える 3

4

モデルの同じフィールドから両方の値にインデックスを付ける方法を見つけました。

まず、フィールドの ascii 値を返すモデルにメソッドを記述します。

class Car(models.Model):
    name = model.CharField()

    def ascii_name(self):
        return strip_accents(self.name)

インデックスを生成するために使用されるテンプレートで、次のようにすることができます。

{{ object.name }}
{{ object.ascii_name }}

次に、インデックスを再構築するだけです。

于 2010-02-14T14:05:15.390 に答える
3

はい、あなたはここで正しい軌道に乗っています。異なる変換を適用して、フィールドを複数回保存したい場合があります。

私のアプリケーションでのこの例は、2 つのtitleフィールドがあることです。1 つは語幹が付けられる検索用 (テスト ~= テスト ~= テスターのプロセス) で、もう 1 つはそのままの状態で並べ替え用 (語幹が並べ替え順序に干渉する) です。

これは類似のケースです。

私の schema.xml では、これは次のように処理されます。

<field name="title" type="text" indexed="true" stored="true" multiValued="false" />
<field name="title_sort" type="string" indexed="true" stored="true" multiValued="false" />

タイプ「string」は、タイトルの「現状のまま」のバージョンを格納する責任があります。

ところで、単語を検索しやすくするためだけにアクセントを取り除いているのであれば、これは調べる価値があるかもしれません: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ISOLatin1AccentFilterFactory

于 2010-02-11T08:08:28.440 に答える
1

次のようなことをしなければなりません:

Cars(indexes.SearchIndex):
    name = indexes.CharField(model_attr='name')

    def prepare(self, obj):
        self.prepared_data = super(Cars, self).prepare(obj)
        self.prepared_data['name'] += '\n' + strip_accents(self.prepared_data['name'])
        return self.prepared_data

私はこの解決策が好きではありません。検索バックエンドを構成する方法を知りたいです。私はシューシューを使っています。

于 2012-09-28T15:09:12.057 に答える