1

クエリ: mpn:"MEM-CF-512MB-AOK"

Solr 応答:

{
"responseHeader": {
"status": 0,
"QTime": 1,
"params": {
  "fl": "id, mpn, name",
  "indent": "true",
  "q": "mpn:\"MEM-CF-512MB-AOK\"",
  "_": "1375801439480",
  "wt": "json"
}
},
"response": {
"numFound": 2,
"start": 0,
"docs": [
  {
    "id": "1340120",
    "mpn": "MEM-CF-256MB-AOK",
    "name": "256MB CompactFlash"
  },
  {
    "id": "1340129",
    "mpn": "MEM-CF-512MB-AOK",
    "name": "512MB CompactFlash"
  }
  ]
},
"spellcheck": {
  "suggestions": [
  "correctlySpelled",
  true
]
 }
}

期待される:

 {
        "id": "1340129",
        "mpn": "MEM-CF-512MB-AOK",
        "name": "512MB CompactFlash"
      }

検索が必要です:

1)MEM-CF-512MB-AOK

2)MEM-CF-512MB

3)MEM-CF-512MB-AO

4)M-CF-512MB-AOK

5) -CF-512MB-AOK

schema.xml:

<field name="mpn" type="text_general_edge_ngram" indexed="true" stored="true"/>

<fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100">
   <analyzer type="index">
      <tokenizer class="solr.LowerCaseTokenizerFactory"/>
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="front"/>
   </analyzer>
   <analyzer type="query">
      <tokenizer class="solr.LowerCaseTokenizerFactory"/>
   </analyzer>
</fieldType>
4

2 に答える 2

2

LowercaseTokenizerLetterTokenizerはおよび と同等の機能ですLowercaseFilter。あなたが提供したケースから判断するとLetterTokenizer、文字の連続したセットのみをインデックス化するような機能は必要ありません。事実上、Ngramming の前に、次のトークンがあります。

mem, cf, mb, aok

KeywordTokenizer私はあなたが欲しいと思うLowercaseFilter

先頭だけでなく末尾の文字が欠落していても検索できるようにするため、プレフィックス クエリを実行する必要があります。EdgeNgramTokenizer は、次のように文字を先頭から外す NGram のみを生成します。

mem-cf-512mb-aok, em-cf-512mb-aok, m-cf-512mb-aok, -cf-512mb-aok

したがって、最後に欠落している文字がある一致を見つけるには、次のような単純なプレフィックス検索が機能するはずです。

m-cf-512mb-a*

minGramSize="1"ほぼ間違いなく熱心すぎる。おそらく 1 グラムは必要ありません (つまり、 だけに一致します"k")。たとえば、上記の最小ケースの長さは 12 です。妥当な最小グラム サイズとして 5 を推測します。

<analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowercaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="5" maxGramSize="50" side="front"/>
</analyzer>
<analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowercaseFilterFactory"/>
</analyzer>

ここでも、末尾にワイルドカードを追加したクエリを使用する必要があります。

于 2013-08-06T16:22:37.783 に答える
0

あなたが説明したシナリオは、mpnフィールドで完全に一致するように見えます。

ただし、mpnmingram=1 で Edge-NGram として定義しました。これにより、1 グラム以降のインデックス作成が開始されます。これはあなたが必要とするものではないと思います。

これをソートするには、別のフィールド (別の理由で NGram が必要な場合) を用意し、それに対して正確なクエリを一致させることができると思います。元

mpn_exact:"MEM-CF-512MB-AOK"

管理コンソールの分析コンポーネントを使用して、これをテストできます。

于 2013-08-06T15:17:38.310 に答える