我已经用StandandAnalyzer实现了RamDirectory,并将位置数据存储在Lucene缓存中,我在Lucene中添加了如下数据:
final Document document = new Document();
final IndexableField id = new StringField("placeId", place.getPlaceId(), Field.Store.YES);
final IndexableField name = new TextField("name", place.getName().toLowerCase(), Field.Store.YES);
final IndexableField location = new LatLonPoint("location", place.getLatitude(), place.getLongitude());
final IndexableField city = new StringField("city", place.getCity(), Field.Store.YES);
document.add(id);
document.add(name);
document.add(location);
document.add(city);
我已经实现了两种方法来搜索数据,一种是定义半径内的附近位置,效果很好,另一种是按名称搜索位置。 我们还必须在按名称搜索时实现自动完成功能。
我已经按名称实现了搜索,如下所示:
QueryParser parser = new QueryParser("name", analyzer);
return parser.createPhraseQuery("name", searchStr, 2);
现在我有一个名字叫"汤姆诊所和药房"的地方。
如果我使用以下短语进行搜索,我会得到结果:
- 汤姆
- 汤姆诊所
- 汤姆药房
这很好,但是如果用户键入"Tom clini"或"Tom pharma",Lucene不会给我任何结果。
我尝试在 searchStr 的末尾添加一个"*",尝试将该短语传递给通配符查询(在单个单词上工作正常,但在多个单词上失败)。
另外,我想添加一点模糊性,以便处理错别字,我是Lucene的新手,不知道从这里开始该怎么做,所以无论如何都要帮我!
附言它的Lucene 7.3
在这些情况下,最好的办法是始终寻找好的资源。我可以建议以下书籍
- Lucene in Action(老而金)
- Lucene 4食谱(以下示例摘自本书);
. 特别是,您可能对以下其中一项或两者感兴趣:
模糊查询
Lucene的模糊搜索实现基于Levenshtein距离。 它比较两个字符串并找出单个字符的数量 将一个字符串转换为另一个字符串所需的更改。这 结果数字表示两个字符串的接近程度。在一个 模糊搜索,阈值编辑次数用于确定是否 匹配两个字符串。若要在查询解析器中触发模糊匹配,请 可以使用波浪号~字符。中有几个配置 用于调整此类型查询的查询解析器。这是一个代码
queryParser.setFuzzyMinSim(2f); queryParser.setFuzzyPrefixLength(3); Query query = queryParser.parse("hump~");
此示例将返回第一、第二和第四句作为 模糊匹配驼峰匹配驼峰,因为错过了这两个词 由两个字符。我们将模糊查询调整到最小相似度 此示例中的两个。
短语查询和多短语查询
短语查询匹配特定的术语序列,而 多短语查询为您提供了一个选项,用于匹配 相同的位置。例如,MultiPhrasQuery 支持诸如 驼峰(笨蛋或一起),其中它匹配位置 0 的驼峰 和垃圾或一起在位置 1。
怎么做...
下面是演示这两种查询类型的代码片段:
PhraseQuery query = new PhraseQuery(); query.add(new Term("content", "humpty")); query.add(new Term("content", "together")); MultiPhraseQuery query2 = new MultiPhraseQuery(); Term[] terms1 = new Term[1]; terms1[0] = new Term("content", "humpty"); Term[] terms2 = new Term[2]; terms2[0] = new Term("content", "dumpty"); terms2[1] = new Term("content", "together"); query2.add(terms1); query2.add(terms2);
它是如何工作的...
第一个查询,短语查询,一起搜索短语humpty。 第二个查询 MultiPhraseQuery 搜索 短语矮胖(笨蛋或一起)。第一个查询将返回 我们设置中的第四句话,而第二个查询将返回 第一、二、四句。请注意,在多短语查询中,多个 相同位置的项将作为数组添加。
但是,直接处理Lucene的应用程序并不多,而是使用Solr或Elastic Search更为常见。两者都在引擎盖下使用Lucene,但它包装精美。可能值得一看。
使用模糊查询
您可以对要搜索的字段使用模糊查询。请注意,之所以使用 TextField,是因为将分析这些字段(而 StringField 不会)并用于全文搜索。
在此处阅读更多模糊查询
使用 SpanNear 查询
匹配彼此接近的跨度。可以指定 slop、干预不匹配位置的最大数量,以及是否需要按顺序进行匹配。
阅读更多 这里 SpanNearQuery