1

查询:mpn:"MEM-CF-512MB-AOK"

索尔回应:

{
"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

架构.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

LowercaseTokenizer是等价于 aLetterTokenizer和的功能LowercaseFilter。从您提供的案例来看,您不想要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>

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

于 2013-08-06T16:22:37.783 回答
0

您描述的场景看起来像是mpn现场完全匹配。

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

为了得到这个排序,我想你可以有另一个字段(如果你想要 NGram 出于另一个原因)并让你的查询与它完全匹配。前任

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

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

于 2013-08-06T15:17:38.310 回答