【问题标题】:How to write a Lucene query that returns all words containing the letter "t"?如何编写一个返回所有包含字母“t”的单词的 Lucene 查询?
【发布时间】:2011-01-11 16:59:09
【问题描述】:

我尝试了这个 Lucene 代码示例,它有效:
http://snippets.dzone.com/posts/show/8965

然而变化:
查询查询 = parser.parse("st.");

查询查询 = parser.parse("t");

返回零命中。

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

编辑:这是有效的:

RegexQuery regexquery = new RegexQuery(new Term("fieldname", ".t."));
isearcher.search(regexquery, 收集器);
System.out.println("collector.getTotalHits()=" + collector.getTotalHits());

【问题讨论】:

    标签: lucene


    【解决方案1】:

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

    【讨论】:

    • 这行得通:<pre> RegexQuery regexquery = new RegexQuery(new Term("fieldname", ".*t.*")); isearcher.search(正则表达式查询,收集器); System.out.println("collector.getTotalHits()=" + collector.getTotalHits()); </pre>
    • 哇,我从未听说过RegexQuery。它是什么时候添加到库中的?我承认,我已经有几年没有使用 Lucene 了。
    • 我也是通过阅读同事的代码偶然听说的。通过查看 RegexQuery(开源的乐趣之一)的颠覆日志,它至少从 2005 年 12 月 28 日起就在 Lucene 中。但是,这是 contrib 的一部分,而不是(还不是?)Lucene 的核心查询之一。
    • @hjo1620:我看到你试图在你的评论中格式化一些代码。您所要做的就是用反引号括住您的代码(它就在键盘上“1”键的左侧)。
    【解决方案2】:

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

    parser.parse("st*"); // Will math "st.", "station", "steal", etc...
    

    不幸的是,文档表明:

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

    意思是,你不能使用这个语法:

    parser.parse("*t*");
    

    因此,您不能要求 Lucene 在任意位置返回包含字母“t”的术语。您可以要求 Lucene 返回以某个字母开始的术语。

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

    【讨论】:

    • 其实可以使用前导通配符,所以查询“t”是可以的。您只需要启用它们。来自 Lucene 常见问题解答 (wiki.apache.org/lucene-java/LuceneFAQ):“QueryParser 默认不支持前导通配符(例如 *ook)。从 Lucene 2.1 开始,可以通过调用 QueryParser.setAllowLeadingWildcard( true ) 来启用它们。请注意,这可以是代价高昂的操作:它需要完整扫描索引中的标记列表以查找与模式匹配的标记。”
    • @Kai:整洁!哇,我真的离开 Lucene 库有一段时间了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多