検索用にサーバーでオートコンプリートを機能させようとしています。これは、私のインデクサー クラスの 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 を使用してみましたが、同様の結果が得られました。