一種方法是使用自定義過濾器。例如,如果你想過濾器的基礎上的ID爲您的域類,則可以將ID添加到搜索的配置領域類:
static searchable = {
id name: "id"
}
那麼你會編寫自定義過濾器(可去[項目]/src目錄/ JAVA):
import org.apache.lucene.search.Filter;
import java.util.BitSet;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexReader;
import java.io.IOException;
import java.util.List;
public class IdFilter extends Filter {
private List<String> ids;
public IdFilter(List<String> ids) {
this.ids = ids;
}
public BitSet bits(IndexReader reader) throws IOException {
BitSet bits = new BitSet(reader.maxDoc());
int[] docs = new int[1];
int[] freqs = new int[1];
for(String id : ids) {
if (id != null) {
TermDocs termDocs = reader.termDocs(new Term("id", id));
int count = termDocs.read(docs, freqs);
if (count == 1) {
bits.set(docs[0]);
}
}
}
return bits;
}
}
然後你會把過濾器作爲參數傳遞給您的搜索(確保如果在不同的包的)進口過濾器類:
def theSearchResult = MyDomainClass.search(
{
must(queryString(params.q))
},
params,
filter: new IdFilter([ "1" ]))
在這裏,我只是創建一個硬編碼列表,其中包含單值「1」,但您可以從數據庫,以前的搜索或任何地方檢索ID列表。
你可以很容易地抽象過濾器,我必須在構造函數中使用術語名稱,然後像你想要的那樣傳入「名稱」。