21

django を利用した Web サイト用の単純な検索ツールが必要だったので、Haystack と Solr を使用しました。すべてを正しく設定し、正確なフレーズを入力すると正しい検索結果を見つけることができますが、部分的なフレーズを入力すると結果が得られません。

例: "John" は "John Doe" を返しますが、"Joh" は何も返しません。

モデル:

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

検索インデックス:

class PersonIndex(SearchIndex):
    text = CharField(document=True, use_template=True)
    first_name = CharField(model_attr = 'first_name')
    last_name = CharField(model_attr = 'last_name')

site.register(Person, PersonIndex)

部分的なフィールドの一致を有効にする設定が欠けていると思います。いくつかのフォーラムで人々が話しているのを見EdgeNGramFilterFactory()たことがあり、Google で検索しましたが、その実装についてはよくわかりません。さらに、検索バックエンドを切り替えた場合に備えて、干し草の山固有の方法があることを望んでいました。

4

5 に答える 5

16

インデックスのテキスト フィールドを EdgeNgramField にすることで、その動作を実現できます。

class PersonIndex(SearchIndex):
    text = EdgeNgramField(document=True, use_template=True)
    first_name = CharField(model_attr = 'first_name')
    last_name = CharField(model_attr = 'last_name')
于 2013-04-18T12:33:46.087 に答える
2

このページで他の人が言及したEdgeNgramFieldヒント (そしてもちろんNgramField、アジア言語を使用している場合) に加えて、Django_haystack では、次のコマンドを使用して Solr で生のクエリを実行できることに言及する価値があると思います。

from haystack.query import SearchQuerySet
from haystack.inputs import Raw
SearchQuerySet().filter(text=Raw(query))

wheretextは検索するフィールドで、は Lucene のクエリ パーサー シンタックス (バージョン3.6または4.6query ) に基づくものであれば何でもかまいません。

このようにして、クエリを構文に適合するものまたはその他ABC*のものに簡単に設定できます。ABC~

于 2013-05-22T19:02:47.167 に答える
1

たとえば、英語以外の単語を検索しているときに、同様の問題が発生しました。

ABC
ABCD

キーワードを検索したい場合ABC、上記の 2 つの結果が期待されます。キーワードを小文字に変換して使用することで、次のことを達成できましたstartswith

keywords = 'ABC'
results.filter(code__startswith=keywords.lower())
于 2011-03-31T20:43:30.883 に答える
1

私は同じ問題を抱えていましたが、必要な結果を得る唯一の方法は、solr 構成ファイルを変更して ngram フィルタリングを含めることでした。これは、デフォルトのトークナイザーが空白に基づいているためです。そのため、代わりにNGramTokenizerを使用してください。同じことをする干し草の山があるかどうか知りたいです。

私は今自分のマシンにいませんが、これでうまくいくはずです。

<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
于 2011-06-14T22:01:09.700 に答える