繁体   English   中英

带有不完整单词的Lucene Phrase查询

[英]Lucene Phrase query with incomplete words

我已经使用 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);

现在我有一个名字叫“汤姆诊所和药房”的地方。

如果我使用以下短语搜索,我会得到结果:

  1. 汤姆
  2. 汤姆诊所
  3. 汤姆药房

这很好,但是如果用户输入“Tom clini”或“Tom pharma”,Lucene 不会给我任何结果。

我尝试在 searchStr 的末尾添加一个“*”,尝试将短语传递给通配符查询(在单个单词上工作正常,但在多个单词上失败)。

此外,我想添加一些模糊性,以便可以处理拼写错误,我是 Lucene 的新手,不知道从这里开始做什么,所以无论如何请帮助我!

PS 它的 Lucene 7.3

在这些情况下,最好的办法始终是寻找好的资源。 我可以建议以下书籍

. 特别是您可能对以下一项或两项都感兴趣:

模糊查询

Lucene 的模糊搜索实现基于 Levenshtein 距离。 它比较两个字符串并找出将一个字符串转换为另一个字符串所需的单个字符更改次数。 结果数字表示两个字符串的接近程度。 在模糊搜索中,使用阈值编辑次数来确定两个字符串是否匹配。 要在 QueryParser 中触发模糊匹配,您可以使用波浪号 ~ 字符。 QueryParser 中有几个配置可以调整这种类型的查询。 这是一个代码

queryParser.setFuzzyMinSim(2f); queryParser.setFuzzyPrefixLength(3); Query query = queryParser.parse("hump~");

此示例将返回第一、第二和第四个句子,因为模糊匹配匹配 hump 到 humpty,因为这两个单词被两个字符遗漏了。 在本例中,我们将模糊查询调整为与 2 的最小相似度。

PhraseQuery 和 MultiPhraseQuery

PhraseQuery 匹配特定的术语序列,而 MultiPhraseQuery 为您提供在同一位置匹配多个术语的选项。 例如,MultiPhrasQuery 支持诸如 humpty(dumpty OR together)之类的短语,其中它匹配位置 0 中的 humpty 和位置 1 中的 dumpty or together。

怎么做...

以下是演示两种查询类型的代码片段:

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

它是如何工作的…

第一个查询 PhraseQuery 一起搜索短语 humpty。 第二个查询 MultiPhraseQuery 搜索短语 humpty(dumpty OR together)。 第一个查询将从我们的设置中返回句子四,而第二个查询将返回句子一、二和四。 请注意,在 MultiPhraseQuery 中,将同一位置的多个术语添加为数组。

然而,直接处理 Lucene 的应用程序并不多,使用SolrElastic Search更为常见。 两者都在引擎盖下使用 Lucene,但它包装得很漂亮。 大概值得一看。

使用模糊查询
您可以在要搜索的字段上使用模糊查询。 请注意,您使用 TextField 是因为这些字段将被分析(而 StringField 不会)并用于全文搜索。

在这里阅读更多FuzzyQuery


使用 SpanNear 查询
匹配彼此接近的跨度。 可以指定 slop、中间未匹配位置的最大数量,以及是否需要按顺序匹配。

在此处阅读更多信息SpanNearQuery

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM