package com.alipay.tiansuan.solrplugin; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.search.FilteredTermEnum; import org.apache.lucene.search.MultiTermQuery; import org.apache.lucene.util.ToStringUtils; import java.io.IOException; import java.util.Arrays; public class StringContainsQuery extends MultiTermQuery { private static final long serialVersionUID = 1L; private String field; private String[] contains; public StringContainsQuery(String[] contains, String field) { this.field = field; this.contains = contains; } public static class ListTermEnum extends FilteredTermEnum { private boolean endEnum = false; private String field; private String[] contains; public ListTermEnum(IndexReader reader, String field, String[] contains) throws IOException { this.field = field; this.contains = contains; this.setEnum(reader.terms(new Term(this.field))); } @Override protected boolean termCompare(Term term) { if (!term.field().equals(this.field)) { endEnum = true; return false; } String termVal = term.text(); for (String contain : this.contains) { if (termVal.indexOf(contain) >= 0) { return true; } } return false; } @Override public float difference() { return 1.0f; } @Override protected boolean endEnum() { return endEnum; } } @Override protected FilteredTermEnum getEnum(IndexReader reader) throws IOException { return new ListTermEnum(reader, this.field, this.contains); } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + ((this.contains == null) ? 0 : Arrays.hashCode(this.contains)); result = prime * result + ((field == null) ? 0 : field.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; StringContainsQuery other = (StringContainsQuery) obj; if (contains == null) { if (other.contains != null) return false; } else if (!Arrays.equals(contains, other.contains)) return false; if (field == null) { if (other.field != null) return false; } else if (!field.equals(other.field)) return false; return true; } @Override public String toString() { return "SelectInListQuery [term=" + field + ", contains=" + Arrays.toString(contains) + ", hashcode=" + Arrays.hashCode(this.contains) + "]"; } @Override public String toString(String field) { StringBuilder buffer = new StringBuilder(); if (!this.field.equals(field)) { buffer.append(this.field); buffer.append(":"); } buffer.append(this.toString()); buffer.append(ToStringUtils.boost(getBoost())); return buffer.toString(); } }