加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Lucene.Net大于/小于TermRangeQuery?

发布时间:2020-12-15 18:32:34 所属栏目:百科 来源:网络整理
导读:我已经建立了一个Lucene.net书籍索引.一切都运行良好,但我需要添加另一种方式来查询索引,我无法弄清楚如何做到这一点. 基本上每本书都有适合的年龄范围.这由两列表示 – minAge和maxAge.两列都是整数. 我正在索引并将这些字段存储在以下循环中 foreach (var
我已经建立了一个Lucene.net书籍索引.一切都运行良好,但我需要添加另一种方式来查询索引,我无法弄清楚如何做到这一点.

基本上每本书都有适合的年龄范围.这由两列表示 – minAge和maxAge.两列都是整数.

我正在索引并将这些字段存储在以下循环中

foreach (var catalogueBook in books)
{
    var book = new Book(catalogueBook.CatalogueBookNo,catalogueBook.IssueId);

    var strTitle = book.FullTitle ?? "";
    var strAuthor = book.Author ?? "";
    // create a Lucene document for this book
    var doc = new Document();

    // add the ID as stored but not indexed field,not used to query on
    doc.Add(
        new Field(
            "BookId",book.CatalogueBookNo.ToString(System.Globalization.CultureInfo.InvariantCulture),Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS,Field.TermVector.NO));

    // add the title and author as stored and tokenized fields,the analyzer processes the content
    doc.Add(
        new Field("FullTitle",strTitle.Trim().ToLower(),Field.Index.ANALYZED,Field.TermVector.NO));

    doc.Add(
        new Field("Author",strAuthor.Trim().ToLower(),Field.TermVector.NO));

    doc.Add(
        new Field("IssueId",book.IssueId,Field.TermVector.NO));

    doc.Add(
        new Field(
            "PublicationId",book.PublicationId.Trim().ToLower(),Field.TermVector.NO));

    doc.Add(
        new Field(
            "MinAge",book.MinAge.ToString("0000"),Field.TermVector.NO));

    doc.Add(
        new Field(
            "MaxAge",book.MaxAge.ToString("0000"),Field.TermVector.NO));

    doc.Add(new NumericField("Price",true).SetDoubleValue(Convert.ToDouble(book.Price)));

    //Now we can loop through categories
    foreach(var bc in book.GetBookCategories())
    {
        doc.Add(
            new Field("CategoryId",bc.CategoryId.Trim().ToLower(),Field.TermVector.NO));
    }

    // add the document to the index
    indexWriter.AddDocument(doc);
}

// make lucene fast
indexWriter.Optimize();
}

正如您所看到的,我正在填充minAge和maxAge字段,因为我认为对它运行TermRangeQuery最容易.

但是,我需要使用Age查询minAge和maxAge列,以查看Age是否落在minAge和maxAge定义的Age范围内.

Sql会的

Select * 
From books 
where @age >= minAge and @age <= maxAge

不幸的是我看不到这样做的方法.这在Lucene.Net中甚至可能吗?

解决方法

如果内存服务,你应该能够利用范围查询来做到这一点.这实际上是标准范围查询的反转,但您应该能够,例如:
+minAge:[* TO @age] +maxAge:[@age TO *]

或者,如果构造查询对象,则使用上限或下限null的RangeQuery(或更好的NumericRangeQuery)作为开放式范围.

我之前使用过上面的语法,但支持似乎有点……不稳定.如果这不起作用,您可以随时设置一个足够低的下限(0)和上限(例如1000),例如:

+minAge:[0000 TO @age] +maxAge:[@age TO 1000]

哪个应该足够安全,除非任何Methuselahs.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读