Lucene Phrase用不完整的单词查询

时间:2018-04-15 13:35:58

标签: 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);

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

我按名称实施了搜索:

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

现在我有一个名字的地方让我们说#34; Tom诊所和药房"。

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

  1. 汤姆
  2. 汤姆诊所
  3. 汤姆药房
  4. 哪个好,但是如果用户键入" Tom clini"或者" Tom pharma",Lucene没有给我任何结果。

    我试图添加" *"在searchStr的末尾,尝试将短语传递给wildcardQuery(对单个单词有效,但多个单词失败)。

    另外我想添加模糊性以便处理错别字,我是Lucene的新手,不知道该怎么做,所以无论如何都可以帮助我!

    它的Lucene 7.3

2 个答案:

答案 0 :(得分:0)

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

。 特别是您可能对以下其中之一感兴趣,或者对以下两者都感兴趣:

  

模糊查询

     

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

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

此示例将返回第一,第二和第四句作为   模糊匹配使驼峰与驼峰匹配,因为这两个单词都被遗漏了   两个字符。我们将模糊查询调整为与   在这个例子中是两个。

     

PhraseQuery和MultiPhraseQuery

     

PhraseQuery匹配特定的术语序列,而   MultiPhraseQuery提供了一个选项来匹配   相同的位置。例如,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);
     

工作原理…

     

第一个查询PhraseQuery一起搜索短语humpty。   第二个查询MultiPhraseQuery搜索   短语矮胖(矮胖或在一起)。第一个查询将返回   我们的设置中的第四个句子,而第二个查询将返回   一,二,四句。请注意,在MultiPhraseQuery中,多个   处于相同位置的术语会作为数组添加。

但是,没有很多直接与Lucene关联的应用程序,更常见的是使用SolrElastic Search。两者都在引擎盖下使用Lucene,但包装精美。可能值得一看。

答案 1 :(得分:0)

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

在此处FuzzyQuery

了解更多


使用SpanNear查询
匹配彼此接近的跨度。可以指定斜率,最大中间不匹配位置数以及是否需要按顺序进行匹配。

在这里SpanNearQuery

了解更多