查询: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>
答案 0 :(得分:2)
LowercaseTokenizer
功能相当于LetterTokenizer
和LowercaseFilter
。根据您提供的案例判断,您不希望LetterTokenizer
- 类似功能,它只会索引连续的字母集。实际上,在Ngramming之前,你有代币:
mem, cf, mb, aok
我认为您想要的是KeywordTokenizer
和LowercaseFilter
由于您希望能够在结尾和开头搜索缺少的字符,因此您需要执行前缀查询。 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"
您可以使用管理控制台的分析组件对其进行测试。