Lucene短语匹配,结尾带有通配符

Lucene短语匹配,结尾带有通配符,lucene,Lucene,我正在尝试做一个预测性文本搜索,允许用户开始输入,然后从他们的文本中得到结果 例如,使用“ca”,他们可以获得 “帽子里的猫”, “我的微积分很酷” “猫狗老鼠” 然而,如果一个人继续用空格打字,我希望整个短语被视为一个术语 例如,“我的猫”应该找到 “帽子里的猫” 但不是“猫狗老鼠”或“我的演算很酷” 这是我当前的代码,但它似乎并不像我希望的那样工作: val mySort = new Sort(SortField.FIELD_SCORE, new SortField("popularity"

我正在尝试做一个预测性文本搜索,允许用户开始输入,然后从他们的文本中得到结果

例如,使用“ca”,他们可以获得 “帽子里的猫”, “我的微积分很酷” “猫狗老鼠”

然而,如果一个人继续用空格打字,我希望整个短语被视为一个术语

例如,“我的猫”应该找到 “帽子里的猫”

但不是“猫狗老鼠”或“我的演算很酷”

这是我当前的代码,但它似乎并不像我希望的那样工作:

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

基本上有两种方法可以实现这一点

旧方法是手动构造一个
多短语库
——有关详细信息,请参阅

不过,新方法更简单:构造一个。使用以下参数:
inoorder=true
slop=0
来获得短语查询的等价项

span查询
中的每个子句都应该是一个,但最后一个除外。这些应该是你的短语中包含的完整术语

最后一个子句应该是a,包装为a。使用短语的最后一个词作为前缀值

综上所述,对于
第一类

SpanNearQuery [inOrder = true, slop = 0]
 |
 +-- SpanTermQuery [term = "cat"]
 |
 +-- SpanMultiTermQueryWrapper<PrefixQuery>
      |
      +-- Prefixquery [prefix = "i"]
pannarQuery[inoder=true,slop=0]
|
+--SpanTermQuery[term=“cat”]
|
+--跨距多温断路器
|
+--Prefixquery[prefix=“i”]

谢谢-我一直在玩complexprase,似乎有些东西像“cat I*”一样工作。你认为这样更好还是使用Spanar更好?我不知道
complexprasequiry
(我不太使用Lucene的查询解析器)。我快速查看了源代码,在您的例子中,这个查询基本上被重写为
span查询
。因此,最后也是同样的方法,如果您更容易构建,您可以使用
complexprasequery