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

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

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

QueryParser parser = new QueryParser("name", analyzer);
return parser.createPhraseQuery("name", searchStr, 2);

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

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

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

这很好,但是如果用户键入"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

最新更新