2016-12-26 35 views
0

我是新来的Apache Lucene的。我正在使用最新版本:6.3.0与facet库结合使用。 基于我在GitHub上找到了例子:https://github.com/apache/lucene-solr/tree/master/lucene/demo/src/java/org/apache/lucene/demo/facet的Apache Lucene的回报小面从领域文档

我有以下文件

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 似乎所有面域与“虚拟”创建: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); 

这是一个错误?

回答

-1

按我的理解,你想获取作者,它应该返回为“鲍勃”的价值。

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

公共类FacetField扩展字段

这里是现场初始化

场pathField =新StringField( “路径”,file.toString(), 场的例子。 Store.YES);
doc.add(pathField);

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

SolrInputDocument doc = new SolrInputDocument();
String id =“1”;
String author =“Erick”;
字符串文本=“我爱Solr的书”;
doc.addField( “ID”,ID);
doc.addField(“author”,title);
doc.addField( “文本”,文本);

为了undertand Solr的Indeing &使用Solrj请逆向工程&这link搜索。

我希望这会有所帮助。

+0

他问一个具体问题有关Lucene的类FacetField - 它不是真正相关SolrJ而据我所知,与Solr的集成? – MatsLindh

+0

好感谢我将添加修正:) –

1

我遇到同样的问题我自己。如果你写说文件,并与搜索获得它,你会看到FacetFields实际上并未存储为文档的一部分。此外,搜索FacetField中的值不起作用(返回0结果)。这会是很好,如果有一个标志或一些会导致场被写入各自的分类和索引本身,但我认为这个问题是该文件的索引已不适用于其他几个属性方面的领域,所以他们只是让他们分开,以避免混淆。

我周围的工作方式是通过在公文写作领域两次:用所需的属性一个为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)); 
...