【问题标题】:Solr / Lucene: Get all field names sorted by number of occurrences in indexSolr / Lucene:获取按索引中出现次数排序的所有字段名称
【发布时间】:2013-04-23 08:54:14
【问题描述】:

我想获取所有字段(即字段名称)的列表,按它们在 Solr 索引中出现的次数排序,即:最常出现的字段、第二常出现的字段和以此类推。

或者,获取索引中的所有字段以及它们出现的次数也足够了。

如何使用单个 solr 查询或通过 solr/lucene java API 完成此操作?

字段集不是固定的,范围有数百个。几乎所有字段都是动态的,除了 id 可能还有更多。

【问题讨论】:

  • 它们出现的次数是什么意思?这可以用多种不同的方式来解释。

标签: solr lucene indexing


【解决方案1】:

Solr: Retrieve field names from a solr index? 中所述,您可以使用 LukeRequesthandler 执行此操作。

为此,您需要在 solrconfig.xml

启用 requestHandler
<requestHandler name="/admin/luke" class="org.apache.solr.handler.admin.LukeRequestHandler" />

然后调用它

http://solr:8983/solr/admin/luke?numTerms=0

如果您想按某些内容对字段进行排序,您需要自己执行此操作。如果您在 java 环境中,我建议使用 Solrj。

使用 Solrj 获取字段

@Test
public void lukeRequest() throws SolrServerException, IOException {
  SolrServer solrServer = new HttpSolrServer("http://solr:8983/solr");

  LukeRequest lukeRequest = new LukeRequest();
  lukeRequest.setNumTerms(1);
  LukeResponse lukeResponse = lukeRequest.process(solrServer );

  List<FieldInfo> sorted = new ArrayList<FieldInfo>(lukeResponse.getFieldInfo().values());
  Collections.sort(sorted, new FieldInfoComparator());
  for (FieldInfo infoEntry : sorted) {
    System.out.println("name: " + infoEntry.getName());
    System.out.println("docs: " + infoEntry.getDocs());
  }
}

示例中使用的比较器

public class FieldInfoComparator implements Comparator<FieldInfo> {
  @Override
  public int compare(FieldInfo fieldInfo1, FieldInfo fieldInfo2) {
    if (fieldInfo1.getDocs() > fieldInfo2.getDocs()) {
      return -1;
    }
    if (fieldInfo1.getDocs() < fieldInfo2.getDocs()) {
      return 1;
    }
    return fieldInfo1.getName().compareTo(fieldInfo2.getName());
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2011-10-26
    相关资源
    最近更新 更多