我正在构建一个需要自动完成搜索功能的应用程序。我正在使用Lucene 4.2.1
实施,我正在使用RegexQuery
来搜索自动完成功能。我的要求是,当用户输入具有多个术语(例如咖啡馆咖啡日)的搜索查询时,只有当该术语中至少有三个字母时,才应考虑任何术语的类型进行搜索。
例如:如果用户已输入 cafe 这个词,现在开始输入 coffee ,但只是远远超过 c 或 co </ em>搜索者不应将这些令牌视为正则表达式查询。
请建议我如何达到预期的效果?有没有一种方法可以指定术语验证之类的内容,告诉QueryParser
忽略生成的查询中少于3个字母的术语或searcher
给定的Query
。
答案 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类来创建自定义查询解析器