使用lucene自动完成如何丢弃某些搜索词

时间:2013-04-29 14:34:25

标签: java lucene

我正在构建一个需要自动完成搜索功能的应用程序。我正在使用Lucene 4.2.1实施,我正在使用RegexQuery来搜索自动完成功能。我的要求是,当用户输入具有多个术语(例如咖啡馆咖啡日)的搜索查询时,只有当该术语中至少有三个字母时,才应考虑任何术语的类型进行搜索。

例如:如果用户已输入 cafe 这个词,现在开始输入 coffee ,但只是远远超过 c co <​​/ em>搜索者不应将这些令牌视为正则表达式查询。

请建议我如何达到预期的效果?有没有一种方法可以指定术语验证之类的内容,告诉QueryParser忽略生成的查询中少于3个字母的术语或searcher给定的Query

2 个答案:

答案 0 :(得分:1)

我不建议将自动完成与正则表达式查询拼凑在一起,而是建议您查看Lucene Suggest API

除此之外,你并没有真正说明你当前的实现如何运作。但是,如果您不想在仅输入当前单词的两个字母时进行搜索,则只需不要进行搜索调用。

如果您想要搜索,但想要忽略所有包含2个或更少字符的单词,您可能会受益于使用标准的标记化查询,并应用具有LengthFilter的分析器。如果您不知道如何组合自定义Analyzer,那么请使用Lucene文档中的示例,例如:

Analyzer analyzer = new Analyzer() {
 @Override
  protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    Tokenizer source = new FooTokenizer(reader); //ex. StandardAnalyzer
    TokenStream filter = new FooFilter(source); //ex. StandardFilter, LowercaseFilter, StopFilter, etc.
    filter = new BarFilter(filter);
    filter = new LengthFilter(true, filter, 3, Integer.MAX_VALUE);
    return new TokenStreamComponents(source, filter);
  }
};

就正则表达式查询而言,如果您需要将“this and that a.*”转换为“this and that.*”,则需要自己实现该转换。

答案 1 :(得分:0)

您还可以通过扩展现有的Query Parser类来创建自定义查询解析器