gpt4 book ai didi

.net - Lucene.Net:如何在搜索结果中添加日期过滤器?

转载 作者:行者123 更新时间:2023-12-04 10:02:11 26 4
gpt4 key购买 nike

我的搜索器工作得非常好,但它确实会返回过时的结果。我的网站很像 NerdDinner,过去的事件变得无关紧要。

我目前正在像这样编制索引
注意:我的示例是在 VB.NET 中,但我不在乎示例是否在 C# 中给出

    Public Function AddIndex(ByVal searchableEvent As [Event]) As Boolean Implements ILuceneService.AddIndex

Dim writer As New IndexWriter(luceneDirectory, New StandardAnalyzer(), False)

Dim doc As Document = New Document

doc.Add(New Field("id", searchableEvent.ID, Field.Store.YES, Field.Index.UN_TOKENIZED))
doc.Add(New Field("fullText", FullTextBuilder(searchableEvent), Field.Store.YES, Field.Index.TOKENIZED))
doc.Add(New Field("user", If(searchableEvent.User.UserName = Nothing,
"User" & searchableEvent.User.ID,
searchableEvent.User.UserName),
Field.Store.YES,
Field.Index.TOKENIZED))
doc.Add(New Field("title", searchableEvent.Title, Field.Store.YES, Field.Index.TOKENIZED))
doc.Add(New Field("location", searchableEvent.Location.Name, Field.Store.YES, Field.Index.TOKENIZED))
doc.Add(New Field("date", searchableEvent.EventDate, Field.Store.YES, Field.Index.UN_TOKENIZED))

writer.AddDocument(doc)

writer.Optimize()
writer.Close()
Return True

End Function

请注意我如何有一个存储事件日期的“日期”索引。

我的搜索看起来像这样
''# code omitted
Dim reader As IndexReader = IndexReader.Open(luceneDirectory)
Dim searcher As IndexSearcher = New IndexSearcher(reader)
Dim parser As QueryParser = New QueryParser("fullText", New StandardAnalyzer())
Dim query As Query = parser.Parse(q.ToLower)

''# We're using 10,000 as the maximum number of results to return
''# because I have a feeling that we'll never reach that full amount
''# anyways. And if we do, who in their right mind is going to page
''# through all of the results?
Dim topDocs As TopDocs = searcher.Search(query, Nothing, 10000)
Dim doc As Document = Nothing

''# loop through the topDocs and grab the appropriate 10 results based
''# on the submitted page number
While i <= last AndAlso i < topDocs.totalHits
doc = searcher.Doc(topDocs.scoreDocs(i).doc)
IDList.Add(doc.[Get]("id"))
i += 1
End While
''# code omitted

我确实尝试了以下操作,但无济于事(抛出 NullReferenceException)。
        While i <= last AndAlso i < topDocs.totalHits
If Date.Parse(doc.[Get]("date")) >= Date.Today Then
doc = searcher.Doc(topDocs.scoreDocs(i).doc)
IDList.Add(doc.[Get]("id"))
i += 1
End If
End While

我还找到了以下文档,但我无法理解它
http://lucene.apache.org/java/1_4_3/api/org/apache/lucene/search/DateFilter.html

最佳答案

您正在链接到 Lucene 1.4.3 的 api 文档。 Lucene.Net 目前是 2.9.2。我认为升级是应该的。

首先,您正在使用 Store.Yes。存储的字段会使您的索引变大,这可能是性能问题。通过以“yyyyMMddHHmmssfff”格式(这是非常高分辨率,低至毫秒)将日期存储为字符串,可以轻松解决您的日期问题。您可能希望降低分辨率以创建更少的 token 以减少索引大小。

var dateValue = DateTools.DateToString(searchableEvent.EventDate, DateTools.Resolution.MILLISECOND);
doc.Add(new Field("date", dateValue, Field.Store.YES, Field.Index.NOT_ANALYZED));

然后您将过滤器应用于您的搜索(第二个参数,您当前在其中传入 Nothing/null)。
var dateValue = DateTools.DateToString(DateTime.Now, DateTools.Resolution.MILLISECOND);
var filter = FieldCacheRangeFilter.NewStringRange("date",
lowerVal: dateValue, includeLower: true,
upperVal: null, includeUpper: false);
var topDocs = searcher.Search(query, filter, 10000);

您可以使用 BooleanQuery 将您的普通查询与 RangeQuery 相结合来完成此操作,但这也会影响评分(根据查询而不是过滤器计算)。为了简单起见,您可能还希望避免修改查询,以便您知道执行的是什么查询。

关于.net - Lucene.Net:如何在搜索结果中添加日期过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4565303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com