我有自定义字段类型:
var products = _productsService.GetAllQuerable
(
x => x.ProductsRank.Where(y => y.TypeVote != null).OrderByDescending(y => y.TypeVote) &&
x.Title.Contains(term)
).Take(5);
一个地址数据库表,它将完整地址索引为我的SOLR实例的文本,例如:
<fieldType class="solr.TextField" name="text_pre" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
还有一个预先输入框,它返回的搜索结果与用户当前输入的值最接近。
我的问题是,对于上面例子中的地址,键入“W”或“West”或“W”。不会根据我的自定义字段类型返回上述地址。
我不确定是否/如何在我的字段类型上自定义过滤器来实现此目的。我不需要支持“西”或“w”。输入,我需要输入“123 W Was”并获得上面的示例地址才能获得正确的结果。
答案 0 :(得分:1)
如果您将NgramFilterFactory与WhitespaceTokenizer一起使用,您将获得每个令牌的ngrams。使用KeywordTokenizerFactory可能会得到更像你想要的东西,因为它会从整个字符串字段而不是单个字创建ngram标记。这样它也适用于空间。
<fieldType class="solr.TextField" name="text_pre" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>