Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java lucene不区分大小写的排序搜索_Java_Lucene_Case Insensitive - Fatal编程技术网

Java lucene不区分大小写的排序搜索

Java lucene不区分大小写的排序搜索,java,lucene,case-insensitive,Java,Lucene,Case Insensitive,如何使用不区分大小写的模式通过多字段排序进行搜索 我使用的是lucene 4.10.4版本,并使用多文件排序进行排序 SortField[] sortFiled = new SortField[2]; sortFiled[0] = new SortField("name", SortField.Type.STRING); sortFiled[1] = new SortField("country", SortField.Type.STRING); TopDocs topDocs = index

如何使用不区分大小写的模式通过多字段排序进行搜索

我使用的是lucene 4.10.4版本,并使用多文件排序进行排序

SortField[] sortFiled = new SortField[2];
sortFiled[0] = new SortField("name", SortField.Type.STRING);
sortFiled[1] = new SortField("country", SortField.Type.STRING);

TopDocs topDocs = indexSearcher.search(query, 10 , new Sort(sortFiled));
它给出排序结果,但在区分大小写模式下。我希望它以不区分大小写的模式排序

SortField[] sortFiled = new SortField[2];
sortFiled[0] = new SortField("name", SortField.Type.STRING);
sortFiled[1] = new SortField("country", CaseInsensitiveStringComparator());
将SortField中的custome filedCompartorSource用于SortField类型。 在上面的代码中,我们以不区分大小写的模式对国家字段进行排序。 请参见下面的自定义FieldComparatorSource类

class CaseInsensitiveStringComparator extends FieldComparatorSource{

@Override
public FieldComparator<String> newComparator(String arg0, int arg1, int arg2,
        boolean arg3) throws IOException {
    return new CaseIgonreCompare(arg0, arg1);
}
}



class CaseIgonreCompare extends FieldComparator<String>{

private String field;
private String bottom;
private String topValue;
private BinaryDocValues cache;
private String[] values;

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

@Override
public int compare(int arg0, int arg1) {
    return compareValues(values[arg0], values[arg1]);
}

@Override
public int compareBottom(int arg0) throws IOException {
    return compareValues(bottom, cache.get(arg0).utf8ToString());
}

@Override
public int compareTop(int arg0) throws IOException {
    return compareValues(topValue, cache.get(arg0).utf8ToString());
}

public int compareValues(String first, String second) {
    int val = first.length() - second.length();
    return val == 0 ? first.compareToIgnoreCase(second) : val;
};

@Override
public void copy(int arg0, int arg1) throws IOException {
   values[arg0] = cache.get(arg1).utf8ToString();
}

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

@Override
public FieldComparator<String> setNextReader(AtomicReaderContext arg0)
        throws IOException {
    this.cache = FieldCache.DEFAULT.getTerms(arg0.reader(), 
            field  , true);
    return this;
}

@Override
public void setTopValue(String arg0) {
    this.topValue = arg0;
}

@Override
public String value(int arg0) {
    return values[arg0];
}
class CaseInsensitiveStringComparator扩展FieldComparatorSource{
@凌驾
公共字段比较器参数(字符串arg0、整数arg1、整数arg2、,
布尔值arg3)引发IOException{
返回新的caseigonRecrease(arg0,arg1);
}
}
类CaseIgonRecover扩展了FieldComparator{
私有字符串字段;
私有串底;
私有字符串topValue;
私有二进制文件缓存;
私有字符串[]值;
public CaseIgonRecare(字符串字段,整数){
this.field=字段;
this.values=新字符串[numHits];
}
@凌驾
公共整数比较(整数arg0,整数arg1){
返回比较值(值[arg0],值[arg1]);
}
@凌驾
public int comparebotom(int arg0)引发IOException{
返回compareValue(底部,cache.get(arg0.utf8ToString());
}
@凌驾
public int compareTop(int arg0)引发IOException{
返回compareValue(topValue,cache.get(arg0.utf8ToString());
}
公共整数比较值(字符串第一,字符串第二){
int val=first.length()-second.length();
返回val==0?第一个。CompareTignoreCase(第二个):val;
};
@凌驾
公共无效副本(int arg0,int arg1)引发IOException{
值[arg0]=cache.get(arg1.utf8ToString();
}
@凌驾
公共void setBottom(int arg0){
this.bottom=值[arg0];
}
@凌驾
公共字段比较器setNextReader(AtomicReaderContext arg0)
抛出IOException{
this.cache=FieldCache.DEFAULT.getTerms(arg0.reader(),
字段,正确);
归还这个;
}
@凌驾
公共void setTopValue(字符串arg0){
this.topValue=arg0;
}
@凌驾
公共字符串值(int arg0){
返回值[arg0];
}
}