7

バックエンドとして使用しているhaystackプロジェクト内で使用しています。solrDjangoと同様に、包含検索を実行できるようにしたい.filter(something__contains="...")

この__startswithオプションは、名前が示すように、文字列で始まる単語を検索するため、ニーズに適合しません。

のようなものを使用しようとしましたが、Solrでは最初の文字としてを使用*keyword*できません*

ありがとう。

4

4 に答える 4

9

「含む」機能を取得するには、次を使用できます。

<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文字が含まれている必要があります。

于 2011-06-14T07:31:48.503 に答える
2

solrスキーマに触れることなく同じ動作を実現できます。インデックスで、テキストフィールドをCharFieldではなくEdgeNgramFieldにします。内部的には、これはlindstromhenrikが提案したものと同様のスキーマを生成します。

于 2013-04-18T12:28:43.893 に答える
0

私は次のような式を使用しています:.filter(something__startswith ='...').filter_or(name =' ' + s'...')solrは' ... *'のような式が好きではないようですが、と組み合わせるか、実行します

于 2013-01-25T11:23:38.967 に答える
0

ここでの答えはどれも実際の部分文字列検索を行いません*keyword*

大きな文字列の一部であるキーワードは見つかりません(プレフィックスサフィックスではありません)。

インデックスでEdgeNGramFilterFactoryまたはを使用すると、「 startswith」または「endswith」タイプのフィルタリングのみを実行できます。EdgeNgramField

解決策は、次のようなNgramFieldを使用することです。

class MyIndex(indexes.SearchIndex, indexes.Indexable):
    ...
    field_to_index= indexes.NgramField(model_attr='field_name')
    ...

schema.xmlに手動で何も追加する必要がないため、これは非常にエレガントです。

于 2013-12-19T18:27:39.957 に答える