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