有没有一种简单的方法可以让Hibernate搜索以小写的形式索引所有的值?而不是默认的混合大小写。
我使用了注解@Field。但是我似乎不能配置一些应用程序级别的集合
发布于 2012-03-07 17:14:28
我真是个傻瓜!StandardAnalyzer类已以小写形式进行索引。这只是一个将搜索词设置为小写的问题。我假设查询会做到这一点。
但是,如果要在应用程序范围内使用不同的分析器,则可以使用属性hibernate.search.analyzer.对其进行设置
发布于 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。
发布于 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.第二种方法是,您可以在排序时实现比较类,如下所示
@Override
public FieldComparator newComparator(String field, int numHits, int sortPos, boolean reversed) throws IOException {
return new StringValComparator(numHits, field);
}使用扩展的FieldComparatorSource类创建一个类,并实现上述方法。
使用StringValComparator创建了新的类名,并实现了FieldComparator并实现了以下方法
类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 name(“SortField”,new StringCaseInsensitiveComparator(),true);
https://stackoverflow.com/questions/9588338
复制相似问题