首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Hibernate-Search不区分大小写的索引?

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

Stack Overflow用户
提问于 2012-03-07 01:02:15
回答 3查看 4.6K关注 0票数 3

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

我使用了注解@Field。但是我似乎不能配置一些应用程序级别的集合

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-07 17:14:28

我真是个傻瓜!StandardAnalyzer类已以小写形式进行索引。这只是一个将搜索词设置为小写的问题。我假设查询会做到这一点。

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

票数 4
EN

Stack Overflow用户

发布于 2012-03-31 23:49:39

分析器应用了小写、术语拆分、删除常用术语和许多更高级的语言处理功能。

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

例如,具有特定语言的分析是有用的,因此使用中文特定例程处理中文描述,使用意大利语分词器处理意大利语描述。

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

还要考虑到,当使用Lucene Queryparser时,API会要求您使用适当的Analyzer。

当使用Hibernate Search QueryBuilder时,它会尝试对每个字段应用正确的分析器;另请参阅http://docs.jboss.org/hibernate/search/4.1/reference/en-US/html_single/#search-query-querydsl

票数 0
EN

Stack Overflow用户

发布于 2016-08-01 19:10:33

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

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

@字段({@字段(index=Index.YES,analyze=Analyze.YES,store=Store.YES),@字段(index=Index.YES,名称= "nameSort",分析器=@分析器(impl=KeywordAnalyzer.class),存储= Store.YES)})

私有字符串名称;

假设您有自定义分析器的name属性,并对其进行排序。所以这是不可能的,那么您可以在索引中添加新字段,并对该字段使用nameSort apply sort。您必须应用Keyword Analyzer类,因为这不是tokeniz字段,并且默认情况下在字段中应用小写工厂类。

2.第二种方法是,您可以在排序时实现比较类,如下所示

代码语言:javascript
复制
@Override
public FieldComparator newComparator(String field, int numHits, int sortPos, boolean reversed) throws IOException {
    return new StringValComparator(numHits, field);
}

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

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

类StringValComparator扩展了FieldComparator {

代码语言:javascript
复制
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 name(“SortField”,new StringCaseInsensitiveComparator(),true);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9588338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档