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

Lucene 如何索引和搜索动态字段名和值,lucene,hibernate-search,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 fie

我有两节课

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;
}
公共班级学生
{
//主键
私有字符串id;
私有字符串名称;//name=Jonathan
....
私有列表自定义字段;
}
公共类自定义字段
{
//主键
私有字符串id;
私有字符串字段名;
....
私有字符串字段值;
}
customFields由用户定义,可以是任何字段和值。例如:customFields列表中有两个对象。它们是[id=001,fieldName=age,value=30][id=002,fieldName=score,value=90]。(用户还可以在customFields列表中添加/更新一些必要的字段,customFields是动态的)

因此,如果班级“学生”发送到我的网页,它将在网页上显示:姓名:[Jonathan]年龄:[30]分数:[90]

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

所以我需要使用Hibernate搜索对动态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?
            }
        }
    }
公共类CustomFieldBridge实现FieldBridge
{
公共无效集(字符串名称、对象值、文档、LuceneOptions LuceneOptions)
{
Field.Store Store=luceneOptions.getStore();
Field.Index=luceneOptions.getIndex();
Field.TermVector TermVector=luceneOptions.getTermVector();
Float boost=luceneOptions.getBoost();
if(值!=null)
{
列表自定义字段=(列表)值;
用于(CustomField CustomField:customFields)
{
字符串fieldName=customField.getFiledName();
String fieldValue=customField.getFiledValue();
字段=新字段(字段名、字段值、store.YES、index.NOT_分析、,
termVector);//该字段是否将逐个索引到Lucene文档中?是否可以搜索它?对吗?
字段.setBoost(boost);
document.add(field);//此操作是否将字段索引到Lucene文档中?
}
}
}

看看如何实现自定义FieldBridge-


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

了解如何实现自定义FieldBridge-


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

使用自定义桥接器进行索引应该很容易,但我不确定您希望如何搜索。如果您将fieldName设置为Lucene文档字段名,您会遇到一个问题,即您不知道要搜索哪些字段。此外,根据字段值的类型,您可能需要不同的分析器。例如,应该对数字进行索引和分析d与字符串不同。为了得到更好的答案,您应该更好地描述您的用例,特别是您计划如何构建搜索查询(也称为确定要搜索的字段)Hardy,谢谢你的回答!这是一个用户案例:用户可以通过名称、年龄和分数字段进行搜索。因此这些字段应该被索引到Lucene文档中(年龄和分数是动态的,如果用户将“年龄”更改为“性别”,那么我们需要更新索引)。如果使用Hibernate搜索为自定义字段编制索引,我如何为动态字段编写索引注释?关键是如何在CustomField类中为fieldName编制索引。我们可以很容易地为“id”属性编制索引,但这是硬代码字段。但是如何为动态属性“fieldName”编制索引?使用custom bridge,但我不确定要如何搜索。如果将fieldName设置为Lucene文档字段名,则存在的问题是,您不知道要搜索哪些字段。此外,根据字段值的类型,您可能需要不同的分析器。例如,应将数字编入索引,并对字符串进行不同的分析。为了获得更好的结果答案你应该更好地描述你的用例,特别是你计划如何构建搜索查询(也就是确定搜索哪些字段)Hardy,谢谢你的回答!有一个用户案例:用户可以按名称、年龄和分数字段进行搜索。所以这些字段应该编入Lucene文档中(年龄和分数是动态的,如果用户将“年龄”更改为“性别”,那么我们需要更新索引)。如果使用Hibernate搜索为自定义字段编制索引,我如何为动态字段编写索引注释?关键是如何在CustomField类中为fieldName编制索引。我们可以很容易地为'id'属性编制索引,但这是硬代码字段。但是如何为动态属性'fieldName'编制索引?谢谢!Hardy。太棒了!我已经编辑了我的问题,你能帮我看一下“编辑”部分吗?我写了一个CustomFieldBridge,对吗?CustomFieldBridge一般都可以。你需要考虑是否要将值存储在索引中(实际搜索不需要store.YES,只有在你想使用投影的情况下)。此外,您还需要考虑分析。对于数字,不分析也可以,但名称至少可以拆分为标记(前提是它包含名字和姓氏)。我建议您在分析数据之前阅读整个主题