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