我正在尝试进行预测性文本搜索,允许用户开始输入,其结果来自文本结果
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
答案 0 :(得分:2)
基本上有两种方法可以达到这个目的。
旧方式,是手动构建MultiPhraseQuery
- 有关详细信息,请参阅this answer。
new 方式更简单:构建SpanNearQuery
。使用以下参数:inOrder = true
和slop = 0
来获得等效的PhraseQuery
。
SpanNearQuery
中的每个条款应为SpanTermQuery
,但最后一个条款除外。这些应该是您的短语中包含的完整术语。
最后一个句子应该是SpanMultiTermQueryWrapper<PrefixQuery>
,包裹PrefixQuery
。使用短语的最后一个词作为前缀值。
总结一下,cat i
:
SpanNearQuery [inOrder = true, slop = 0]
|
+-- SpanTermQuery [term = "cat"]
|
+-- SpanMultiTermQueryWrapper<PrefixQuery>
|
+-- Prefixquery [prefix = "i"]