1

検索にはDjango Haystackを使用しています。

結果を検索するときに、自分のモデルのフィールドのみを対象にしたいと考えています。title

ただし、現時点では、検索語がモデルのいずれかのフィールドにある場合に結果が返されます。

例: xyzを検索すると、 xyzbioフィールドにある結果が得られます。

これは起こるべきではありません。xyztitleフィールドにある結果のみを返したいのです。Artist.title検索以外のすべてのフィールドを完全に無視します。

artists/models.py:

class Artist(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(max_length=100)
    strapline = models.CharField(max_length=255)
    image = models.ImageField(upload_to=get_file_path, storage=s3, max_length=500)
    bio = models.TextField()

artists/search_indexes.py

from haystack import indexes
from app.artists.models import Artist

class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True, model_attr='title')

    def get_model(self):
        return Artist

SQLクエリのように考えていると思います:

SELECT * FROM artists WHERE title LIKE '%{search_term}%'

アップデート

use_template=True を削除するという提案に従って、私の search_indexes.py は次のようになります。

from haystack import indexes
from app.artists.models import Artist


class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, model_attr='title')
    title = indexes.CharField(model_attr='title')

    def get_model(self):
        return Artist

しかし、私は同じ問題を抱えています。(python manage.py rebuild_index を試しました)

違いがある場合、これは私のHaystack設定です。

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',
    },
}
4

4 に答える 4

4

model_attrそして use_template一緒に仕事をしないでください。この場合、単一のモデル属性を照会しているため、テンプレートを使用する必要はありません。検索インデックスのテンプレートは、純粋にデータをグループ化するためのものです。

したがって、次のようになります。

class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, model_attr='title')

    def get_model(self):
        return Artist
于 2013-08-14T10:10:05.513 に答える
0

ドキュメントから

さらに、use_template=Trueテキスト フィールドで提供しています。これにより、(エラーが発生しやすい連結ではなく) データ テンプレートを使用して、検索エンジンが検索に使用するドキュメントを作成できます。という名前のテンプレート ディレクトリ内に新しいテンプレートを作成し、search/indexes/myapp/note_text.txtその中に以下を配置する必要があります。

{{ object.title }}
{{ object.user.get_full_name }}
{{ object.body }}

したがって、このテンプレートでは、インデックスを作成/検索するフィールドを宣言できると思います

もう 1 つの方法はdef prepare(self, object)、Index クラスをオーバーライドし、インデックス作成/検索が必要なフィールドを明示的に定義することです。または単に使用するmodel_attr

于 2013-08-14T10:06:08.087 に答える