听起来您已经通过分析为您的城市名称编制了索引。这往往会使这变得更加困难。通过分析,“新”和“德里”是不同的术语,必须单独对待。像这样使用通配符搜索多个字词会比较困难。
最简单的解决方案是在不进行标记化的情况下为您的城市名称编制索引(不过,小写可能不是一个坏主意)。然后,您只需转义空格即可使用查询解析器进行搜索:
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());