バックエンドとして使用しているhaystack
プロジェクト内で使用しています。solr
Djangoと同様に、包含検索を実行できるようにしたい.filter(something__contains="...")
この__startswith
オプションは、名前が示すように、文字列で始まる単語を検索するため、ニーズに適合しません。
のようなものを使用しようとしましたが、Solrでは最初の文字としてを使用*keyword*
できません*
ありがとう。
バックエンドとして使用しているhaystack
プロジェクト内で使用しています。solr
Djangoと同様に、包含検索を実行できるようにしたい.filter(something__contains="...")
この__startswith
オプションは、名前が示すように、文字列で始まる単語を検索するため、ニーズに適合しません。
のようなものを使用しようとしましたが、Solrでは最初の文字としてを使用*keyword*
できません*
ありがとう。
「含む」機能を取得するには、次を使用できます。
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="100" side="back"/>
<filter class="solr.LowerCaseFilterFactory" />
インデックスアナライザとして。
これにより、フィールド内の空白で区切られた単語ごとにngramが作成されます。例えば:
"Index this!" => x, ex, dex, ndex, index, !, s!, is!, his!, this!
ご覧のとおり、これによりインデックスが大幅に拡張されますが、次のようなクエリを入力すると、次のようになります。
"nde*"
それはあなたにヒットを与える「ndex」と一致します。
このアプローチを慎重に使用して、インデックスが大きくなりすぎないようにしてください。minGramSizeを増やすか、maxGramSizeを減らすと、インデックスはmutchとして拡張されませんが、「含む」機能が減少します。たとえば、minGramSize = "3"を設定するには、containsクエリに少なくとも3文字が含まれている必要があります。
solrスキーマに触れることなく同じ動作を実現できます。インデックスで、テキストフィールドをCharFieldではなくEdgeNgramFieldにします。内部的には、これはlindstromhenrikが提案したものと同様のスキーマを生成します。
私は次のような式を使用しています:.filter(something__startswith ='...').filter_or(name =' ' + s'...')solrは' ... *'のような式が好きではないようですが、と組み合わせるか、実行します
ここでの答えはどれも実際の部分文字列検索を行いません*keyword*
。
大きな文字列の一部であるキーワードは見つかりません(プレフィックスやサフィックスではありません)。
インデックスでEdgeNGramFilterFactory
またはを使用すると、「 startswith」または「endswith」タイプのフィルタリングのみを実行できます。EdgeNgramField
解決策は、次のようなNgramFieldを使用することです。
class MyIndex(indexes.SearchIndex, indexes.Indexable):
...
field_to_index= indexes.NgramField(model_attr='field_name')
...
schema.xmlに手動で何も追加する必要がないため、これは非常にエレガントです。