SOLR EdgeNGramFilter返回错误的响应

时间:2013-08-06 15:11:10

标签: solr lucene

查询: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>

2 个答案:

答案 0 :(得分:2)

LowercaseTokenizer功能相当于LetterTokenizerLowercaseFilter。根据您提供的案例判断,您不希望LetterTokenizer - 类似功能,它只会索引连续的字母集。实际上,在Ngramming之前,你有代币:

mem, cf, mb, aok

我认为您想要的是KeywordTokenizerLowercaseFilter

由于您希望能够在结尾和开头搜索缺少的字符,因此您需要执行前缀查询。 EdgeNgramTokenizer只生成从前面取字符的NGrams,例如:

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>

同样,您应该使用附加了尾随通配符的查询。

答案 1 :(得分:0)

您所描述的情景看起来与mpn字段完全匹配。

但是,您已使用mingram = 1将mpn定义为Edge-NGram。这将开始索引1-gram。我想,这不是你需要的。

为了得到这个排序,我猜你可以有另一个字段(如果你想要NGram的另一个原因)并且你的确切查询匹配它。实施例

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

您可以使用管理控制台的分析组件对其进行测试。