【问题标题】:lucene wildcard query with space带空格的lucene通配符查询
【发布时间】:2015-12-30 12:07:35
【问题描述】:

我有包含城市名称的 Lucene 索引。 考虑一下我想搜索“新德里”。我有字符串“New Del”,我想将它传递给 Lucene 搜索器,我希望输出为“New Del”。 如果我生成像 Name:New Del* 这样的查询,它将给我所有带有“New and Del”的城市。 有什么方法可以创建带有空格的 Lucene 查询通配符查询吗? 我参考并尝试了几个解决方案@@http://www.gossamer-threads.com/lists/lucene/java-user/5487

【问题讨论】:

    标签: lucene wildcard lucene.net


    【解决方案1】:

    听起来您已经通过分析为您的城市名称编制了索引。这往往会使这变得更加困难。通过分析,“新”和“德里”是不同的术语,必须单独对待。像这样使用通配符搜索多个字词会比较困难。

    最简单的解决方案是在不进行标记化的情况下为您的城市名称编制索引(不过,小写可能不是一个坏主意)。然后,您只需转义空格即可使用查询解析器进行搜索:

    QueryParser parser = new QueryParser("defaultField", analyzer);
    Query query = parser.parse("cityname:new\\ del*");
    

    或者你可以使用一个简单的WildcardQuery

    Query query = new WildcardQuery(new Term("cityname", "new del*"));
    

    使用标准分析仪分析的字段:

    您将需要依赖 SpanQueries,如下所示:

    SpanQuery queryPart1 = new SpanTermQuery(new Term("cityname", "new"));
    SpanQuery queryPart2 = new SpanMultiTermQueryWrapper(new WildcardQuery(new Term("cityname", "del*")));
    Query query = new SpanNearQuery(new SpanQuery[] {query1, query2}, 0, true);
    

    或者,您可以使用环绕查询解析器(它提供的查询语法旨在为跨度查询提供更强大的支持),使用类似W(new, del*) 的查询:

    org.apache.lucene.queryparser.surround.parser.QueryParser surroundparser = new org.apache.lucene.queryparser.surround.parser.QueryParser();
    SrndQuery srndquery = surroundparser.parse("W(new, del*)");
    query = srndquery.makeLuceneQueryField("cityname", new BasicQueryFactory());
    

    【讨论】:

      【解决方案2】:

      正如我从您提到的线程 (http://www.gossamer-threads.com/lists/lucene/java-user/5487) 中了解到的,您可以使用空格进行完全匹配,也可以使用通配符处理任一部分。

      所以这样的事情应该可以工作 - [New* Del*]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 2012-04-18
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多