1

我正在构建一个需要自动完成搜索功能的应用程序。我正在使用Lucene 4.2.1实现,并且正在利用它RegexQuery来搜索自动完成功能。我的要求是,当用户输入包含多个字词的搜索查询(例如咖啡厅咖啡日)时,只有在该字词中至少有三个字母时,才应考虑输入任何字词进行搜索。

例如:如果用户已经输入了单词cafe并且现在开始输入coffee但只走了很远直到cco搜索者不应该考虑使用这些标记进行正则表达式查询。

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

4

2 回答 2

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.*”,则需要自己实现该转换。

于 2013-04-29T15:38:59.123 回答
0

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

于 2013-04-30T22:36:51.433 回答