首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类似于lucene中句子的功能

类似于lucene中句子的功能
EN

Stack Overflow用户
提问于 2017-05-21 21:05:29
回答 1查看 99关注 0票数 0

我试图在Lucene中复制SQL的类似功能。

如果我使用通配符搜索,请说“*郁金香酒店Riyadhh*”,我面临以下行为:

  1. 利雅得郁金香酒店-匹配
  2. 利雅得郁金香酒店-不匹配
  3. 利雅得郁金香酒店
  4. 郁金香搭配
  5. 利雅德-匹配

实际上,我需要一个在Lucene中的例子,其中条件"2“应该匹配,"4”不应该匹配。

我尝试了所有的查询,但是第二个场景不匹配。

一些人建议使用托肯器和自定义分析器。

因为我是Lucene新手,所以我处理查询,但不知道如何将Tokenizer和自定义分析器集成到我们的查询中。

EN

回答 1

Stack Overflow用户

发布于 2017-05-22 06:19:45

如果只需要前缀匹配,则可以使用KeywordTokenizer和LowercaseFilter和EdgeNgramFilter:

代码语言:javascript
复制
<analyzer>
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
  <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="50"/>
</analyzer>

该链将将传入的文本保持为单个令牌(KeywordTokenizer),然后将传入的文本转换为小写(LowerCaseFilter),然后根据字符串长度将其拆分为多个令牌。

如果要匹配字符串中的任何位置,可以使用普通的plain筛选器:

代码语言:javascript
复制
<filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/>

。。但是,请注意,如果min和max之间的差异很大,索引的大小将迅速增长。

还有第二个选项,那就是使用ReversedWildcardFilter,它专门为*foo*查询条件进行调优,所以如果您不需要对每个令牌进行进一步处理(例如对每个单独的令牌进行词干,等等)。这可能是个选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44101781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档