【问题标题】:Sorting search result in Lucene based on a numeric field基于数字字段在Lucene中对搜索结果进行排序
【发布时间】:2014-03-24 19:37:56
【问题描述】:

我有一些包含两个字段的文档:文本、计数。

我使用Lucene 来索引文档,现在我想在文本中搜索并获得按计数降序排序的结果。我该怎么做?

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    Apache Lucene 的默认搜索实现返回按分数排序的结果(最相关的结果在前),然后按 id 排序(最旧的结果在前)。

    可以在查询时使用附加的排序参数自定义此行为。

    TopFieldDocs Searcher#search(Query query, Filter filter, int n, Sort sort)

    Sort 参数指定用于排序的字段或属性。默认实现是这样定义的:

    new Sort(new SortField[] { SortField.FIELD_SCORE, SortField.FIELD_DOC });
    

    要更改排序,您只需将字段替换为您想要的字段:

    new Sort(new SortField[] {
    SortField.FIELD_SCORE,
    new SortField("field_1", SortField.STRING),
    new SortField("field_2", SortField.STRING) });
    

    这听起来很简单,但在满足以下条件之前不会起作用:

    • 您必须指定 SortField(String field, int) 的类型参数 type) 让 Lucene 找到你的字段,即使这很正常 可选。
    • 排序字段必须被索引但不能被标记:

      document.add (new Field ("byNumber", Integer.toString(x), Field.Store.NO, Field.Index.NOT_ANALYZED));

    • 排序字段内容只能是纯文本。如果只有一个 元素在使用的字段之一中具有特殊字符或重音 对于排序,整个搜索将返回未排序的结果。

    检查这个tutorial

    【讨论】:

    • @HomayounAfshari 不客气,对不起,我没有明白你的问题,你到底是什么意思:sort order
    • 我使用这种方法,结果现在是按升序排序的,我无法更改。
    • 字段类型在子类SortField.Type中,所以对于String它是SortField.Type.STRING
    【解决方案2】:

    第一:

    Fieldable count = new NumericField("count", Store.YES, true);
    

    秒:

    SortField field = new SortField("count", SortField.INT);
    Sort sort = new Sort(field);
    

    第三个:

    TopFieldDocs docs = searcher.search(query, 20, sort);
    ScoreDoc[] sds = docs.scoreDocs;
    

    这样就好了!

    【讨论】:

      【解决方案3】:

      下面的行就可以了。最后一个参数是boolean reverse,如果您将其设置为true,它将以相反的顺序排序,即在您的情况下降序。

        SortField longSort = new SortedNumericSortField(FIELD_NAME_LONG, SortField.Type.LONG, true);
      

      示例代码:

        IndexSearcher searcher = new IndexSearcher(reader);
        Query q = new MultiFieldQueryParser(new String[] { FIELD_NAME_NAME}, analyzer).parse("YOUR_QUERY") );
      
        SortField longSort = new SortedNumericSortField(FIELD_NAME_LONG, SortField.Type.LONG, true);
      
        Sort sort = new Sort(longSort);
        ScoreDoc[] hits = searcher.search(q, 10 , sort).scoreDocs;
      

      还必须在创建索引时将启用排序的字段添加为NumericDocValuesField

       doc.add(new NumericDocValuesField(FIELD_NAME_LONG, longValue));//sort enabled field
      

      代码按照 lucene-core-5.0.0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 2017-07-05
        相关资源
        最近更新 更多