如何索引和搜索动态字段名称和值

时间:2012-10-15 08:40:21

标签: lucene hibernate-search

我有两个课程。

public Class Student
{
  //primary key
  private String id;
  private String name;//name = Jonathan
  ....
  private List<CustomField> customFields;
}

public Class CustomField 
{
  //primary key
  private String id;

  private String fieldName;
  ....
  private String fieldValue;
}

customFields由用户定义,可以是任何字段和值。例如:customFields列表中有两个对象。它们是[id = 001,fieldName = age,value = 30] [id = 002,fieldName = score,value = 90]。 (另外用户可以在customFields列表中添加/更新一些必要的字段,customFields是动态的)

所以,如果班级的学生&#39;发送到我的网页,它将显示:姓名:[Jonathan]年龄:[30]得分:[90]在网页上。

用户案例:用户可以按名称,年龄和分数字段进行搜索。所以这些字段应该被索引到Lucene Document中。 如果使用Hibernate搜索索引自定义字段,如何为动态字段编写索引注释?

所以我需要使用Hibernate Search索引和搜索动态的customFields,何我可以实现它?你知道我的意思吗?

修改

public class CustomFieldBriddge implements FieldBridge
{

    public void set(String name, Object value, Document document, LuceneOptions luceneOptions)
    {
        Field.Store store           = luceneOptions.getStore();
        Field.Index index           = luceneOptions.getIndex();
        Field.TermVector termVector = luceneOptions.getTermVector();
        Float boost                 = luceneOptions.getBoost();
        if (value != null)
        {
            List<CustomField> customFields              = (List) value;
            for (CustomField customField : customFields)
            {

                String fieldName = customField.getFiledName();
                String fieldValue = customField.getFiledValue();
                Field field = new Field(fieldName, fieldValue, store.YES, index.NOT_ANALYZED,
                    termVector);    // is the field will index into Lucene document one by one?and it can be searched out? right?
                field.setBoost(boost);
                document.add(field); // is this operation will index the field into Lucuene Document?
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

了解如何实施自定义 FieldBridge - http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#d0e4019

使用自定义字段桥接器,您基本上将获得 CustomField 实例列表以及传递给您的Lucene文档。然后由您来创建 Fieldables 。在您的情况下, CustomField#fieldName 成为Lucene Document 字段名称, CustomField#fieldValue 成为字段值。看一下 DateSplitBridge 示例。