我有Lucene索引,它有城市名称.考虑一下我想搜索"新德里".我有字符串'New Del',我想传递给Lucene搜索者,我期待输出为'新德里'.如果我生成像Name这样的查询:New Del*它会给我所有城市的'New和Del'in.有什么方法可以创建带有空格的Lucene查询通配符查询吗?我提到并尝试了一些解决方案@ http://www.gossamer-threads.com/lists/lucene/java-user/5487
听起来你已经通过分析索引了你的城市名称.这将使这更加困难.通过分析,"新"和"德里"是单独的术语,必须这样对待.使用这样的通配符搜索多个术语往往会有点困难.
最简单的解决方案是在没有标记化的情况下索引您的城市名称(虽然小写可能不是一个坏主意).然后,您只需通过转义空间就可以使用查询解析器进行搜索:
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());