NGram和EdgeNGram过滤地址类型/搜索

时间:2017-11-07 16:34:22

标签: solr

我有自定义字段类型:

 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”并获得上面的示例地址才能获得正确的结果。

1 个答案:

答案 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>