Java 使用lucene自动完成如何放弃某些搜索术语

Java 使用lucene自动完成如何放弃某些搜索术语,java,lucene,Java,Lucene,我正在构建一个需要自动完成搜索功能的应用程序。我正在使用Lucene 4.2.1实现,我正在使用RegexQuery搜索自动完成。我的要求是,当用户输入一个包含多个术语的搜索查询时(例如咖啡馆咖啡日),只有当该术语中至少有三个字母时,才应考虑输入任何术语进行搜索 例如,如果用户已经键入Word咖啡馆,现在开始键入咖啡,但只走了很远的TIL C或CO,搜索者不应该考虑这些令牌用于正则表达式查询。 请建议如何达到预期效果?是否有一种方法可以指定类似术语验证的内容,告诉QueryParser忽略生成的

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

例如,如果用户已经键入Word咖啡馆,现在开始键入咖啡,但只走了很远的TIL C或CO,搜索者不应该考虑这些令牌用于正则表达式查询。
请建议如何达到预期效果?是否有一种方法可以指定类似术语验证的内容,告诉
QueryParser
忽略生成的查询中少于3个字母的术语,或者告诉
searcher
给定的
查询

与其拼凑一个带有正则表达式查询的自动完成,不如让我们看一下

除此之外,对于当前的实现如何工作,您并没有说太多。但是,如果您不想在当前单词只键入了两个字母时进行搜索,那么就不要调用search

如果您说您确实想要搜索,但是想要忽略所有具有2个或更少字符的单词,那么您可能会受益于使用标准的、标记化的查询,并应用具有相同字符的分析器。如果您不知道如何组合一个自定义项,那么请根据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.*
”,则需要自己实现该转换

与其拼凑一个带有正则表达式查询的自动完成,不如让我们看一下

除此之外,对于当前的实现如何工作,您并没有说太多。但是,如果您不想在当前单词只键入了两个字母时进行搜索,那么就不要调用search

如果您说您确实想要搜索,但是想要忽略所有具有2个或更少字符的单词,那么您可能会受益于使用标准的、标记化的查询,并应用具有相同字符的分析器。如果您不知道如何组合一个自定义项,那么请根据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.*
”,则需要自己实现该转换

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

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

我认为“术语验证”不在Lucene的范围之内。为什么不验证/解析应用程序中的术语,并在将其传递给Lucene之前去除无效术语?我认为“术语验证”不在Lucene的范围之内。为什么不验证/解析应用程序中的术语,并在将其传递给Lucene之前去除无效术语?谢谢femtoRgon。。我想对上面的代码稍加修改可能对我有用。。。我将探索建议API。感谢femtoRgon。。我想对上面的代码稍加修改可能对我有用。。。我将探索建议API。thnx表示建议的
离子。