Apache Lucene从文档返回facet字段

时间:2016-12-26 17:26:26

标签: java solr lucene facet

我是Apache Lucene的新手。我使用最新版本:6.3.0与facet库结合使用。 根据我在github上找到的例子:https://github.com/apache/lucene-solr/tree/master/lucene/demo/src/java/org/apache/lucene/demo/facet

我有以下文件

Document doc = new Document();
doc.add(new FacetField("Author", "Bob"));
doc.add(new FacetField("Publish Date", "2010", "10", "15"));
doc.add(new FacetField("Tags", "A"));
doc.add(new FacetField("Tags", "B"));

//[FacetField(dim=Author path=[Bob]), FacetField(dim=Publish Date path=[2010, 10, 15]), FacetField(dim=Tags path=[A]), FacetField(dim=Tags path=[B])]
System.out.println(doc.getFields());

//null
System.out.println(doc.getField("Author"));

doc.getFields()返回所有字段,但doc.getField("Author")返回null。 我做错了吗?

如果我做这样的事情,请进一步挖掘:

for(IndexableField myField:doc.getFields()){
    System.out.println(myField.name());
}

打印以下内容:

dummy
dummy
dummy
dummy

如果我这样做doc.getField("dummy"),它确实会返回第一个字段(作者)。

查看FacetField源代码:https://github.com/apache/lucene-solr/blob/branch_6_3/lucene/facet/src/java/org/apache/lucene/facet/FacetField.java 似乎所有构面字段都是使用" dummy":https://github.com/apache/lucene-solr/blob/branch_6_3/lucene/facet/src/java/org/apache/lucene/facet/FacetField.java

创建的
public FacetField(String dim, String... path) {
super("dummy", TYPE);

这是一个错误吗?

2 个答案:

答案 0 :(得分:1)

我自己遇到了同样的问题。如果您要编写所述文档并通过搜索获取​​它,您会发现FacetFields实际上并未存储为文档的一部分。此外,搜索FacetField中的值不起作用(返回0结果)。如果有一个标志或某些东西导致该字段被写入分类法和索引本身,那将是很好的,但我认为问题是文档索引有几个其他属性不适用于facet字段,所以他们只是将它们分开以避免混淆。

我解决这个问题的方法是在文档上写两次字段:一个是FacetField,另一个是具有所需属性的字段。

示例:

Document doc = new Document();

// Add facet fields, not stored/searchable, but can be drilled down into
doc.add(new FacetField("Author", "Bob"));
...

// Add other fields
doc.add(new TextField("Author", "Bob", Store.YES));
...

答案 1 :(得分:-1)

根据我的理解,您正在尝试检索作者的值,它应该作为“Bob”返回。

FacetField& Field是Lucene中两种不同类型的Fields,它们以不同的方式存储数据。 FacetField是Field类的子类。要初始化Field,您需要字段名称,类型&布尔值,表示您要检索字段。

  

公共类FacetField扩展Field

以下是字段初始化

的示例
  

Field pathField = new StringField(“path”,file.toString(),   Field.Store.YES);
doc.add(pathField);

现在,为了存储文档,你应该这样做。

  

SolrInputDocument doc = new SolrInputDocument();
  String id =“1”;
          String author =“Erick”;
          String text =“我爱Solr书”;
          doc.addField(“id”,id);
          doc.addField(“作者”,标题);
  doc.addField(“text”,text);

为了完成soling Indeing&使用Solrj搜索请回复link

我希望这会有所帮助。