如何编写一个Lucene查询,返回包含字母“quot;t";?

如何编写一个Lucene查询,返回包含字母“quot;t";?,lucene,Lucene,我尝试了这个Lucene代码示例,它很有效: 然而变化: Query=parser.parse(“st.”) 到 Query=parser.parse(“t”) 返回零命中率 如何编写Lucene查询以返回包含字母“t”的所有单词? (返回的最大点击次数=20) 编辑:以下是有效的方法: RegexQuery RegexQuery=新的RegexQuery(新术语(“字段名”、“.t.”) search(regexquery,收集器) System.out.println(“collector

我尝试了这个Lucene代码示例,它很有效:

然而变化:
Query=parser.parse(“st.”)

Query=parser.parse(“t”)

返回零命中率

如何编写Lucene查询以返回包含字母“t”的所有单词?
(返回的最大点击次数=20)

编辑:以下是有效的方法:

RegexQuery RegexQuery=新的RegexQuery(新术语(“字段名”、“.t.”)
search(regexquery,收集器)

System.out.println(“collector.getTotalHits()=”+collector.getTotalHits())

我有好消息和坏消息。好消息是,您可以使用来匹配任何文本:

不幸的是,文件表明:

注意:您不能使用*或?符号 作为搜索的第一个字符

也就是说,您不能使用以下语法:

parser.parse("*t*");
因此,您不能要求Lucene返回在任意位置包含字母“t”的术语。您可以要求Lucene返回以某个字母开头的条款


此时,您唯一的选择似乎是遍历所有术语,进行您自己的匹配。

我有好消息和坏消息。好消息是,您可以使用来匹配任何文本:

不幸的是,文件表明:

注意:您不能使用*或?符号 作为搜索的第一个字符

也就是说,您不能使用以下语法:

parser.parse("*t*");
因此,您不能要求Lucene返回在任意位置包含字母“t”的术语。您可以要求Lucene返回以某个字母开头的条款


此时,您唯一的选择似乎是遍历所有术语,进行您自己的匹配。

您需要一个不同的选项。该示例使用,它删除标点符号并根据空格和其他一些更复杂的规则打断单词。但是,它不会将单词分解成字符。要做到这一点,您可能需要构建自己的自定义分析器,而且似乎在运行时和内存消耗方面都很昂贵。另一个(可能更好)的选择是使用。

您需要一个不同的。该示例使用,它删除标点符号并根据空格和其他一些更复杂的规则打断单词。但是,它不会将单词分解成字符。要做到这一点,您可能需要构建自己的自定义分析器,而且似乎在运行时和内存消耗方面都很昂贵。另一个(可能更好)的选择是使用。

这是有效的:
RegexQuery RegexQuery=new RegexQuery(新术语(“fieldname”,“t.*));search(regexquery,收集器);System.out.println(“collector.getTotalHits()=”+collector.getTotalHits())哇,我从来没有听说过
RegexQuery
。它是什么时候被加入图书馆的?我承认,我已经有好几年没有和Lucene合作了。我还顺便读了一位同事的代码。从RegexQuery(开源的乐趣之一)的subversion日志来看,它至少从2005年12月28日起就在Lucene中。然而,这是contrib的一部分,而不是Lucene的核心查询之一。@hjo1620:我看到您试图在注释中格式化一些代码。你所要做的就是在代码周围加上记号(它就在键盘上“1”键的左边)。这很有效:
RegexQuery RegexQuery=new RegexQuery(新术语(“字段名”),即“*t.*);search(regexquery,收集器);System.out.println(“collector.getTotalHits()=”+collector.getTotalHits())哇,我从来没有听说过
RegexQuery
。它是什么时候被加入图书馆的?我承认,我已经有好几年没有和Lucene合作了。我还顺便读了一位同事的代码。从RegexQuery(开源的乐趣之一)的subversion日志来看,它至少从2005年12月28日起就在Lucene中。然而,这是contrib的一部分,而不是Lucene的核心查询之一。@hjo1620:我看到您试图在注释中格式化一些代码。你所要做的就是在代码周围加上反记号(就在键盘上“1”键的左边)。实际上,你可以使用前导通配符,所以查询“t”是可能的。您只需要启用它们。从Lucene FAQ():“默认情况下,QueryParser不支持前导通配符(例如*ook)。从Lucene 2.1开始,可以通过调用QueryParser.setAllowLeadingWildcard(true)来启用它们。”。请注意,这可能是一项昂贵的操作:它需要扫描索引中的全部标记列表,以查找与模式匹配的标记。“@Kai:Neat!哇,我真的离开Lucene图书馆有一段时间了!实际上,您可以使用前导通配符,因此查询“t”是可能的。您只需要启用它们。从Lucene FAQ():“默认情况下,QueryParser不支持前导通配符(例如*ook)。从Lucene 2.1开始,可以通过调用QueryParser.setAllowLeadingWildcard(true)来启用它们。”。请注意,这可能是一项昂贵的操作:它需要扫描索引中的全部标记列表,以查找与模式匹配的标记。“@Kai:Neat!哇,我真的离开Lucene图书馆有一段时间了!