2012-03-06 115 views

回答

3

我是傻瓜! StandardAnalyzer類是已經小寫索引。這只是將搜索項設置爲小寫的問題。我假設查詢會這樣做。

但是,如果要在整個應用範圍內使用不同的分析儀,則可以使用屬性hibernate.search.analyzer進行設置。

+0

請注意,您也可以在創建查詢時指定分析器,如果您針對不同的字段使用不同的分析器,則這是必需的(例如,對於某些字段,我有一個小寫字母和一個保留索引可以選擇搜索區分大小寫或不區分大小寫)。 – 2012-04-12 06:10:53

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

0

只有在字符串類型字段中對排序不敏感的方法有很多種。

1.第一種方法是在實體上的字段/屬性中添加@Fields註釋。 像

@Fields({@字段(指數= Index.YES,分析= Analyze.YES,存儲= Store.YES) @Field(指數= Index.YES,名字= 「nameSort」,分析器= @Analyzer(impl = KeywordAnalyzer.class),store = Store.YES)})

private String name;

假設你有自定義分析器的名稱屬性和排序。所以這是不可能的,那麼你可以使用nameSort在該字段上應用排序來在索引中添加新的字段。 您必須應用關鍵字分析器類,因爲它不是tokeniz字段,並且默認情況下在字段中應用小寫工廠類。

2.Second方式是,你可以實現你的比較類分揀像

@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]; 
} 

}

應用排序的字段,如

新的SortField (「name」,new StringCaseInsensitiveComparator(),true);

相關問題