带空间的lucene通配符查询

时间:2015-12-30 12:07:35

标签: lucene wildcard lucene.net

我有Lucene索引,其中包含城市名称。 考虑一下我想搜索新德里'。我有字符串' New Del'我希望传递给Lucene搜索者,我期待输出为“新德里”#39; 如果我生成像Name这样的查询:New Del *它将为我提供所有城市中的“New”和“Del”。 有什么方法可以创建带有空格的Lucene查询通配符查询吗? 我在@ http://www.gossamer-threads.com/lists/lucene/java-user/5487

中提到并尝试了一些解决方案

2 个答案:

答案 0 :(得分:5)

听起来您已经通过分析索引了您的城市名称。这将使这更加困难。通过分析," new"和"德里"是单独的条款,必须这样对待。使用这样的通配符搜索多个术语往往会有点困难。

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

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());

答案 1 :(得分:0)

当我从你提到的帖子(http://www.gossamer-threads.com/lists/lucene/java-user/5487)中学到的时候,你可以与空间完全匹配,也可以使用外卡来处理任何部分。

这样的事情应该有效 - [New* Del*]