Lucene.net 2.9.2 排序(排序不起作用)

2024-01-08

我在 .NET 中对 lucene.net 索引进行排序时遇到问题。我尝试了 stackoverflow 上的几乎所有解决方案并寻找谷歌答案。我正在使用 Lucene.NET 2.9.2 和 ASP.NET 2.0。我想像在 sql 中一样对字符串进行排序,您可以输入“order by Title desc [asc]”

我将向您展示我的代码,希望有人可以帮助我。

    //Here I create Index with some fields
    doc.Add(new Field("prod_id",row["prod_id"].ToString(),Field.Store.YES,Field.Index.ANALYZED));
            doc.Add(new Field("prod_title", row["prod_title"].ToString(), Field.Store.YES, Field.Index.ANALYZED));
            doc.Add(new Field("prod_desc", row["prod_desc"].ToString(), Field.Store.YES, Field.Index.ANALYZED));
            doc.Add(new Field("prod_author", row["prod_author"].ToString(), Field.Store.YES, Field.Index.ANALYZED));
            doc.Add(new Field("prod_publisher", row["prod_publisher"].ToString(), Field.Store.YES, Field.Index.ANALYZED));
            doc.Add(new Field("prod_price", row["prod_price"].ToString(), Field.Store.YES, Field.Index.ANALYZED));

//Then next I try to do search with sort option:

//method for return approciate Sort object
private static Sort SetSortForLucene(string _sort)
    {
        Sort sort;
        switch (_sort)
        {
            case "UnitPriceGorss":
                sort = new Sort(new SortField("prod_price",SortField.DOUBLE,false);
                break;

            case "UnitPriceGorssDESC":
                sort = new Sort(new SortField("prod_price",SortField.DOUBLE,true);
                break;

            case "Title":
                //not working
                sort = new Sort(new SortField("prod_title", SortField.STRING, true));
                break;

            case "TitleDESC":
                //not working
                sort = new Sort(new SortField("prod_title", SortField.STRING, false));
                break;
            case "":
                sort = new Sort(new SortField("prod_title", SortField.STRING, false));
                break;
            default:
                sort = new Sort(new SortField("prod_title", SortField.STRING, false));
                break;
        }
        return sort;
    }
//Inside my query of lucene method:
StandardAnalyzer analizer = new StandardAnalyzer(Version.LUCENE_29);
IndexReader reader =IndexReader.Open(IndexPath);
Searcher searcher = new IndexSearcher(reader);
//Here call for Sort object
Sort sort = SetSortForLucene(_sort);
TopFieldDocCollector collector = new TopFieldDocCollector(reader, sort, pageSize);
//Find which document field need to me asked in QueryParser object
string _luceneField = "";

        if (luceneField.Contains("_"))
            _luceneField = luceneField;
        else
        switch (luceneField)
        {
            case "Title": _luceneField = "prod_title"; break;
            case "Description": _luceneField = "prod_desc"; break;
            case "Author": _luceneField = "prod_author"; break;
            case "Publisher": _luceneField = "prod_publisher"; break;
            default: _luceneField = "prod_title"; break;
        }
        QueryParser parser = new QueryParser(_luceneField, analizer);
        Query query = parser.Parse(luceneQuery);
        ScoreDoc[] hits;
        searcher.Search(query,collector);
//Obtaining top records from search but without any sort.
        hits =  collector.TopDocs().scoreDocs;

        foreach (ScoreDoc hit in hits)
        {
            Document doc = searcher.Doc(hit.doc);
            string a = doc.Get("prod_id");
            int id = 0;
            if (hit.score > score)
            {
                if (int.TryParse(doc.Get("prod_id"), out id))
                                tmpId.Add(id);
            }
        }
//I also define stop words for full text searching and i think this is
//real cause of problem with sorting.
System.String[] stopWords = new System.String[]{"a","że","w","przy","o","bo","co","z","za","ze","ta","i","no","do"};

我用过这个stackoverflow 中的链接。 https://stackoverflow.com/questions/3990760/random-sorting-results-in-lucene-net-2-4 and 这个漂亮的链接 http://www.logiclabz.com/c/search-lucene-index-in-net-c-with-sorting-options.aspx解决我的问题,但排序失败,我不知道我的代码出了什么问题。

几天后我终于找到了解决方案。我想要排序的字段在表示字符串值时不应被标记化。

例如,当我想按标题(升序/降序)对产品进行排序时,您应该输入如下内容:

doc.Add(new Field(Product.PROD_TITLE_SORT, row["prod_title"].ToString().Replace(" ", "_") + "_" + row[Product.PROD_ID].ToString(), Field.Store.NO, Field.Index.NOT_ANALYZED));

我不明白的是为什么这个字段不存储也不分析,因此 lucene.net 可以按这个添加的字段进行排序。这个排序字段甚至不在索引中!我用 lukeall-1.0.1.jar 索引浏览器检查过。

其次,您需要创建适当的排序方法:

private static Sort SetSortForLucene(string _sort)
        {
            Sort sort;
            _sort = !string.IsNullOrEmpty(_sort) ? _sort : "";
            switch (_sort)
            {
                case "UnitPriceGorss":
                    sort = new Sort(new SortField(PROD_PRICE, SortField.DOUBLE, false));
                    break;

                case "UnitPriceGorssDESC":
                    sort = new Sort(new SortField(PROD_PRICE, SortField.DOUBLE, true));
                    break;

                case "Title":
                    //not it works perfectly.
                    sort = new Sort(new SortField(PROD_TITLE_SORT, SortField.STRING, true));
                    break;

                case "TitleDESC":
                    //not it works perfectly.
                    sort = new Sort(new SortField(PROD_TITLE_SORT, SortField.STRING, false));
                    break;
                case ""://Here is default sorting behavior. It get's result according to Lucene.NET search result score.
                    sort = new Sort(SortField.FIELD_SCORE);
                    break;
                default:
                    sort = new Sort(SortField.FIELD_SCORE);
                    break;
            }
            return sort;
        }

让我真正怀疑的是,当字段在 lucene 全文索引中建立索引时,排序可以与 SortField.DOUBLE 一起使用。

我希望这篇文章能够帮助任何有类似排序问题的人。


除非您在查询中返回数据,否则不需要存储该字段。然而,它仍然被添加到索引中。

您不分析要排序的字段的原因是分析器将字段分解为单独的术语,这使得排序非常困难,因为文档的索引将包含多个单词,这显然无法针对整个单词进行排序指数。这适用于所有字段类型,无论它们是否是单个术语。

我相信你can存储该字段,但除非您想在查询中返回它,否则不需要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lucene.net 2.9.2 排序(排序不起作用) 的相关文章

随机推荐

  • 在 Visual Studio 设计器中隐藏 WPF 元素

    我有一个 WPF 表单 基本上如下所示
  • 如何设置 Android 操作栏上菜单项的样式

    关于操作栏样式的问题有很多 但我发现的问题要么与选项卡样式有关 要么有不适合我的答案 问题其实很简单 我希望能够更改操作栏中菜单项的文本样式 甚至只是颜色 我读过这个 还有这个问题 Android Honeycomb 中的操作栏样式 htt
  • 如何使用机器人框架和 selenium 读取 Web 控制台输出?

    我正在尝试读取网页的控制台输出 特别是我需要使用 RF 和 Selenium 进行 POST GET PUT ajax 调用 我在网上找到了一些帮助 但似乎无法使其发挥作用 我的Python脚本是 from selenium webdriv
  • 如何动态设置 EditText 高度

    我想简单地将 EditText 组件的高度设置为用户屏幕高度的 50 我正在从 xml 文件 main xml 创建初始布局 该文件加载到 Activity 的 onCreate Bundle 中 从 xml 配置中 我了解如何将 Edit
  • IronPython Web 框架

    Python 似乎有很多优秀的 Web 框架 有人在 IronPython 中使用过这些 Pylons Web2Py Django 吗 Django 已在 IronPython 上运行 http unbracketed org 2008 m
  • 依赖类型:依赖对类型与不相交联合有何相似之处?

    我一直在研究依赖类型 我了解以下内容 Why 通用量化 https en wikipedia org wiki Universal quantification被表示为依赖函数类型 x A B x means 对全部x类型的A有一个类型的值
  • C# Windows 窗体用户控件控件设计器支持

    我正在寻找的是对用户控件内的控件的相同类型的设计器支持 即 调整用户控件内的文本框大小 移动标签将用户控件放置到表单上之后 我能做的事 创建一个用户控件 使用设计器向其添加控件 创建一个新的窗口窗体应用程序 将用户控件添加到工具箱 将控件拖
  • JQuery 在该位置插入表格行

    我一直在研究一种能够向 html 表插入行的解决方案 这非常棘手 我发现了一些有用的东西 但仅适用于第一个 插入 我不知道我做错了什么 我有一个包含 3 列的基本表格 每个表格都有一个按钮 允许在两行之间插入一行 我在这个网站上搜索了一个解
  • 如何让 .env 预提交 + mypy + django-stubs

    我尝试在提交之前配置启动 mypy django stubs 检查 我使用预提交 当我尝试提交时 出现错误django core exceptions ImproperlyConfigured 设置 POSTGRES DB 环境变量 该变量
  • java.sql 中的日期时间等效项? (有 java.sql.datetime 吗?)

    到目前为止 我还没有找到明确的答案 我想知道使用PreparedStatement 的SQL 类型DATETIME 和java 类型的等价物是什么 我已经发现 http www java2s com Code Java Database S
  • Shell 脚本中的 exec ${PERL-perl} -Sx $0 ${1+"$@"} 是什么意思?

    我的任务是将包含 Shell 脚本 Perl 代码的 shell 脚本转换为 Python 我设法将 Perl 代码转换为 Python 但是有这个shell脚本语句我不明白 usr bin sh exec PERL perl Sx 0 1
  • 没有元素时流的特殊行为

    我如何用 java 8 Streams API 表达这一点 我想表演itemConsumer对于流的每个项目 如果有 没有我想要执行的项目emptyAction 当然我可以写这样的东西 Consumer itemConsumer Syste
  • 没有画布的 HTML5 getImageData [重复]

    这个问题在这里已经有答案了 有没有办法在没有画布的情况下使用图像的 getImageData 我想要获取图像鼠标位置处的像素颜色 不 你不能 但是获取 imageData 可以使用内存中的画布来完成 这既快速又简单 var canvas d
  • Powershell ISE 在使用 GitLab Runner 时抛出 RemoteException

    I am trying to stop GitlabRunner windows service using powershell When I execute the command in elevated powershell prom
  • 如何使用可视化代码编辑器在 chrome 上运行 flutter

    如何在 Chrome 上运行 flutter 应用程序 我已经安装了颤振套件并运行 颤振通道测试版 颤振升级 并在 Visual Studio Code 上安装扩展 就像与flutter mobile create flutter laun
  • Python内存模型和指针

    我正在学习 Python 并对 Python 的内存模型感到困惑 变量包含它所引用的对象的内存地址 这听起来就像 Python 变量实际上是指针 因为它们只直接包含实际对象实例的内存地址 那么当我调用变量名时Python会做什么呢 Pyth
  • 在 Python 中将频谱图存储为图像

    我想将音频的 STFT 频谱图存储为图像 下面的代码向我显示了一个频谱图作为输出 但是当保存为图像时 我得到了不同的图像 import numpy as np import matplotlib pyplot as plt import p
  • UICollectionViewCell 中的标签文本未更新

    我正在尝试更改 a 的文本UILabel in a UICollectionViewCell之后UICollectionViewCell已加载 当点击button 但屏幕上的标签不会更新 控制台显示标签的文本属性已更新 但标签似乎并未使用新
  • 对于没有正文的 4xx 错误,Content-Type 应该是什么?

    考虑一个获得以下响应的 HTTP 请求 405 Method Not Allowed Content Length 0 像这样的内容类型应该是什么 设置为无 Not set Set to text plain or text html 您没
  • Lucene.net 2.9.2 排序(排序不起作用)

    我在 NET 中对 lucene net 索引进行排序时遇到问题 我尝试了 stackoverflow 上的几乎所有解决方案并寻找谷歌答案 我正在使用 Lucene NET 2 9 2 和 ASP NET 2 0 我想像在 sql 中一样对