使用Hibernate-Search进行不区分大小写的索引?

时间:2012-03-06 17:02:15

标签: hibernate-search

是否有一种简单的方法可以让Hibernate Search以小写形式索引其所有值?而不是默认的混合大小写。

我正在使用注释@Field。但我似乎无法配置一些应用程序级别的集合

3 个答案:

答案 0 :(得分:3)

我是傻瓜! StandardAnalyzer类已经以小写形式进行索引。这只是将搜索条件设置为小写的问题。我假设查询会这样做。

但是,如果要在应用程序范围内使用不同的分析器,则可以使用属性 hibernate.search.analyzer 进行设置。

答案 1 :(得分:0)

分析器应用小写,术语分割,删除常用术语和更多高级语言处理功能。

通常,您应该处理用于将索引字符串与索引处使用的相同分析器匹配的用户输入;配置 hibernate.search.analyzer 设置默认(全局)分析器,但您可以按索引,每个实体类型,每个字段甚至在不同的实体实例上自定义它。

例如,进行特定于语言的分析非常有用,因此可以使用中文特定的例程处理中文描述,使用意大利语描述符进行意大利语描述。

默认分析器适用于大多数用例,并且可以在空格上小写和拆分术语。

考虑到使用Lucene Queryparser时,API会向您请求相应的分析器。

使用Hibernate Search QueryBuilder时,它会尝试在每个字段上应用正确的Analyzer;另见http://docs.jboss.org/hibernate/search/4.1/reference/en-US/html_single/#search-query-querydsl

答案 2 :(得分:0)

在字符串类型字段中,有多种方法可以使排序不敏感。

1.第一种方法是在实体的字段/属性中添加@Fields注释。 像

@Fields({@字段(指数= Index.YES,分析= Analyze.YES,存储= Store.YES),          @Field(index = Index.YES,name =“nameSort”,analyzer = @Analyzer(impl = KeywordAnalyzer.class),store = Store.YES)})

私人字符串名称;

假设您具有自定义分析器的名称属性并对其进行排序。所以你不可能在索引中添加新的Field,并在该字段上使用nameSort apply sort。 您必须应用关键字分析器类,因为它不是tokeniz字段,默认情况下在字段中应用小写工厂类。

2.第二种方式是你可以在排序上实现你的比较类,如

@Override
public FieldComparator newComparator(String field, int numHits, int sortPos, boolean reversed) throws IOException {
    return new StringValComparator(numHits, field);
}

使用扩展FieldComparatorSource类创建一个类并实现上述方法。

使用StringValComparator创建新的类名并实现FieldComparator 并实施以下方法

class StringValComparator扩展了FieldComparator {

private String[] values;
private String[] currentReaderValues;
private final String field;
private String bottom;

StringValComparator(int numHits, String field) {
  values = new String[numHits];
  this.field = field;
}

@Override
public int compare(int slot1, int slot2) {
  final String val1 = values[slot1];
  final String val2 = values[slot2];
  if (val1 == null) {
    if (val2 == null) {
      return 0;
    }
    return -1;
  } else if (val2 == null) {
    return 1;
  }

  return val1.toLowerCase().compareTo(val2.toLowerCase());
}

@Override
public int compareBottom(int doc) {
  final String val2 = currentReaderValues[doc];
  if (bottom == null) {
    if (val2 == null) {
      return 0;
    }
    return -1;
  } else if (val2 == null) {
    return 1;
  }
  return bottom.toLowerCase().compareTo(val2.toLowerCase());
}

@Override
public void copy(int slot, int doc) {
  values[slot] = currentReaderValues[doc];
}

@Override
public void setNextReader(IndexReader reader, int docBase) throws IOException {
  currentReaderValues = FieldCache.DEFAULT.getStrings(reader, field);
}

@Override
public void setBottom(final int bottom) {
  this.bottom = values[bottom];
}

@Override
public String value(int slot) {
    return values[slot];
}

}

在字段中应用排序

new SortField(“name”,new StringCaseInsensitiveComparator(),true);