当前位置:  开发笔记 > 编程语言 > 正文

带空间的lucene通配符查询

如何解决《带空间的lucene通配符查询》经验,为你挑选了1个好方法。

我有Lucene索引,它有城市名称.考虑一下我想搜索"新德里".我有字符串'New Del',我想传递给Lucene搜索者,我期待输出为'新德里'.如果我生成像Name这样的查询:New Del*它会给我所有城市的'New和Del'in.有什么方法可以创建带有空格的Lucene查询通配符查询吗?我提到并尝试了一些解决方案@ http://www.gossamer-threads.com/lists/lucene/java-user/5487



1> femtoRgon..:

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

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

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

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有