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

Ibr*_*aiq 7 java lucene

我已经使用 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);
Run Code Online (Sandbox Code Playgroud)

我已经实现了两种搜索数据的方法,一种是定义半径内的附近地点,效果很好,另一种是按名称搜索地点。我们还必须在按名称搜索时实现自动完成功能。

我已经按名称实现了搜索,如下所示:

QueryParser parser = new QueryParser("name", analyzer);
return parser.createPhraseQuery("name", searchStr, 2);
Run Code Online (Sandbox Code Playgroud)

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

如果我使用以下短语进行搜索,则会返回结果:

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

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

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

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

PS 它的 Lucene 7.3

AR1*_*AR1 1

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

\n\n\n\n

。\n特别是您可能对以下一项或两项感兴趣:

\n\n
\n

模糊查询

\n\n

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

\n\n
queryParser.setFuzzyMinSim(2f);\nqueryParser.setFuzzyPrefixLength(3);\nQuery query = queryParser.parse("hump~");\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

短语查询和多短语查询

\n\n

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

\n\n

怎么做...

\n\n

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

\n\n
PhraseQuery query = new PhraseQuery();\nquery.add(new Term("content", "humpty"));\nquery.add(new Term("content", "together"));\nMultiPhraseQuery query2 = new MultiPhraseQuery();\nTerm[] terms1 = new Term[1];\nterms1[0] = new Term("content", "humpty");\nTerm[] terms2 = new Term[2];\nterms2[0] = new Term("content", "dumpty");\nterms2[1] = new Term("content", "together");\nquery2.add(terms1);\nquery2.add(terms2);\n
Run Code Online (Sandbox Code Playgroud)\n\n

工作原理\xe2\x80\xa6

\n\n

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

\n
\n\n

然而,直接处理 Lucene 的应用程序并不多,更常见的是使用SolrElastic Search。两者都在底层使用 Lucene,但它的包装很漂亮。也许值得一看。

\n