3

ユーザーが文字列クエリを入力できるかなり単純な Django アプリケーションを作成しています。アプリケーションは、データベース内でこの文字列を検索します。

Entry.objects.filter(headline__contains=query)

このクエリはかなり単純明快ですが、探しているものが 100% わからない人にとってはあまり役に立ちません。ということで、検索範囲を広げました。

from django.utils import stopwords

results = Entry.objects.filter(headline__contains=query)
if(!results):
    query = strip_stopwords(query)
    for(q in query.split(' ')):
        results += Entry.objects.filter(headline__contains=q)

これにいくつかの追加機能を追加したいと思います。スペルミスの単語、複数形、一般的な同音異義語 (同じスペルが異なる音) などを検索します。これらのいずれかが Djangos クエリ言語に組み込まれているかどうか疑問に思っていました。組み込みの何かを本当に探しているだけなので、巨大なアルゴリズムを書くことは私にとって重要ではありません。

すべての回答に感謝します。

4

3 に答える 3

12

Python のdifflibモジュールを使用してみてください。

>>> from difflib import get_close_matches
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('apple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']

問題は、difflib を使用するには、データベースから単語のリストを作成する必要があることです。それは高価になる可能性があります。おそらく、単語のリストをキャッシュして、たまにしか再構築しないとします。

fuzzystrmatch一部のデータベース システムは、PostgreSQL のモジュールのように、必要な検索方法をサポートしています。その場合は、電話してみてください。


編集:

あなたの新しい「要件」については、まあ、あなたは運が悪いです。いいえ、django のクエリ言語には何も組み込まれていません。

于 2009-01-24T18:07:09.610 に答える
5

djangos orm には、すぐに使用できるこの動作はありませんが、django と検索サービスを統合するプロジェクトがいくつかあります。

オプション #2 と #3 がどの程度うまく機能するかはわかりませんが、django-sphinx をかなり使用しており、結果には非常に満足しています。

于 2009-01-24T19:31:54.680 に答える