0

検索用にサーバーでオートコンプリートを機能させようとしています。これは、私のインデクサー クラスの 1 つの例です。

class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    artist_name = indexes.CharField(model_attr='clean_artist_name', null=True)
    submitted_date = indexes.DateTimeField(model_attr='submitted_date')
    total_count = indexes.IntegerField(model_attr='total_count')

    # This is used for autocomplete
    content_auto = indexes.NgramField(use_template=True)

    def get_model(self):
        return Artist

    def index_queryset(self, using=None):
        """ Used when the entire index of a model is updated. """
        return self.get_model().objects.filter(date_submitted__lte=datetime.now())

    def get_updated_field(self):
        return "last_data_change"

textおよびcontent_autoフィールドは、Artsts の場合はアーティスト名だけのテンプレートを使用して入力されます。ドキュメントによると、次のようなものがオートコンプリートで機能するはずです。

objResultSet = SearchQuerySet().models(Artist).autocomplete(content_auto=search_term)

ただし、文字列「bill w」でこれを試みると、Bill Stephney が 1 番目の結果として返され、次に Bill Withers が 2 番目の結果として返されます。これは、Bill Stephney の方がデータベースに多くのレコードを持っているためですが、Stephney はこのクエリに一致するべきではありません。"w" が検出されると、Bill Withers (および他の Bill W) にのみ一致するはずです。ワイルドカードも試しました:

objResultSet = SearchQuerySet().models(Artist).filter(content_auto=search_term + '*')

objResultSet = SearchQuerySet().models(Artist).filter(text=AutoQuery(search_term + '*'))

しかし、ワイルドカードは多くの問題を引き起こしているようです。開発サーバーがハングし、最終的には不可解なスタック トレースのエラーが原因で停止しWrite Failed: Broken Pipeます。これらはすべて Python フレームワーク内にあります。これを適切に機能させることができた人はいますか?NgramField は使用する正しい型ですか? EdgeNgramField を使用してみましたが、同様の結果が得られました。

4

1 に答える 1