问题描述
||
我目前正在使用Lucene作为我们的全文搜索引擎。但是我们需要根据特定字段对搜索结果进行排序。
例如,如果我们的索引中包含以下三个文档,除了
id
字段外,它们的内容完全相同。
val document01 = new Document()
val field0100 = new Field(\"id\",\"1\",Field.Store.YES,Field.Index.ANALYZED)
val field0101 = new Field(\"contents\",\"This is a test: Linux\",Field.Index.ANALYZED)
val field0102 = new Field(\"contents\",\"This is a test: Windows\",Field.Index.ANALYZED)
document01.add(field0100)
document01.add(field0101)
document01.add(field0102)
val document02 = new Document()
val field0200 = new Field(\"id\",\"2\",Field.Index.ANALYZED)
val field0201 = new Field(\"contents\",Field.Index.ANALYZED)
val field0202 = new Field(\"contents\",Field.Index.ANALYZED)
document02.add(field0200)
document02.add(field0201)
document02.add(field0202)
val document03 = new Document()
val field0300 = new Field(\"id\",\"3\",Field.Index.ANALYZED)
val field0301 = new Field(\"contents\",Field.Index.ANALYZED)
val field0302 = new Field(\"contents\",Field.Index.ANALYZED)
document03.add(field0300)
document03.add(field0301)
document03.add(field0302)
现在,当我使用IndexSearcher搜索Linux
时,得到以下结果:
Document<stored,indexed,tokenized<id:1> stored,tokenized<contents:This is a test: Linux> stored,tokenized<contents:This is a test: Windows>>
Document<stored,tokenized<id:2> stored,tokenized<id:3> stored,tokenized<contents:This is a test: Windows>>
搜索Windows
时,得到的结果相同。
Document<stored,tokenized<contents:This is a test: Windows>>
问题是建立索引时是否可以权衡特定字段?例如,如果搜索时匹配make6 like,我希望它具有更高的分数。
换句话说,当我搜索Linux
时,我想按以下顺序获得结果:
Document<stored,tokenized<contents:This is a test: Windows>>
当我搜索Windows
时,它仍然保持原始顺序,如下所示:
Document<stored,tokenized<contents:This is a test: Windows>>
我尝试使用field0201.setBoost()
,但是当我搜索Linux
或Windows
时,都会改变搜索结果的顺序。
解决方法
我认为,将不同来源的数据放在不同名称的字段中应该是可能的。您可以在索引时间设置一个增强,但是如果您使用相同的名称,我认为该增强将适用于所有具有相同名称的字段-基于ѭ14ѭjavadoc。因此,如果您改为这样做:
val field0201 = new Field(\"content-high\",\"This is a test: Linux\",...)
field0201.setBoost(1.5f)
val field0202 = new Field(\"content-low\",\"This is a test: Windows\",...)
然后使用content-high:Linux content-low:Linux
查询(使用带有两个都设置为术语Linux的布尔值查询的布尔查询),然后,如果匹配项位于该字段中,则content-high的提升应增加文档得分。用explain
看看是否有效。