Lucene短语最后与通配符匹配

时间:2015-03-30 16:01:32

标签: lucene

我正在尝试进行预测性文本搜索,允许用户开始输入,其结果来自文本结果

E.g。他们可以得到“ca” “戴着帽子的猫”, “我的微积分很酷” “猫狗老鼠”

但是,如果一个人继续输入空格,我希望将整个短语视为一个术语

E.g。 “猫我”应该找到 “戴着帽子的猫”

但不是“[cat] dog mouse”,也不是“my calculus [i] s cool”

这是我目前的代码,但它似乎没有像我希望的那样工作:

val mySort = new Sort(SortField.FIELD_SCORE, new SortField("popularity", SortField.Type.INT, true))
val analyzer = new StandardAnalyzer(Version.LUCENE_43)

val parser: QueryParser = new QueryParser(Version.LUCENE_43, "title", analyzer)
val query = parser.parse(queryString+"*")
val titleQuery = new ConstantScoreQuery(query)
titleQuery.setBoost(2)

val synopsisQuery = new QueryParser(Version.LUCENE_43, "synopsis", analyzer).parse(queryString)
val summaryQuery = new ConstantScoreQuery(synopsisQuery)

val finalQuery = new DisjunctionMaxQuery(0)
finalQuery.add(titleQuery)
finalQuery.add(summaryQuery)

val collector = TopFieldCollector.create(mySort,Limit,false,true,true,false)

searcher.search(finalQuery, collector)

collector.topDocs().scoreDocs

1 个答案:

答案 0 :(得分:2)

基本上有两种方法可以达到这个目的。

旧方式,是手动构建MultiPhraseQuery - 有关详细信息,请参阅this answer

new 方式更简单:构建SpanNearQuery。使用以下参数:inOrder = trueslop = 0来获得等效的PhraseQuery

SpanNearQuery中的每个条款应为SpanTermQuery ,但最后一个条款除外。这些应该是您的短语中包含的完整术语。

最后一个句子应该是SpanMultiTermQueryWrapper<PrefixQuery>,包裹PrefixQuery。使用短语的最后一个词作为前缀值。

总结一下,cat i

SpanNearQuery [inOrder = true, slop = 0]
 |
 +-- SpanTermQuery [term = "cat"]
 |
 +-- SpanMultiTermQueryWrapper<PrefixQuery>
      |
      +-- Prefixquery [prefix = "i"]