添加依赖
<!--对分词索引查询解析-->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>7.1.0</version>
</dependency>
<!--smartcn 中文分词器 SmartChineseAnalyzer smartcn分词器 需要lucene依赖 且和lucene版本同步-->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-smartcn</artifactId>
<version>7.1.0</version>
</dependency>
创建索引
/*索引路径*/
static String indexDir = "D:\\index\\user";
//中文分词器
static Analyzer analyzer = new SmartChineseAnalyzer();
//保存索引
public void write(){
/*索引存放的位置*/
Directory directory = null;
IndexWriterConfig config = null;
IndexWriter writer = null;
try {
directory = FSDirectory.open(Paths.get(indexDir));//磁盘目录,RAMDirectory内存
config = new IndexWriterConfig(analyzer);
writer = new IndexWriter(directory,config);
Integer count = dao.findCount();
Integer offset = 0;
Integer row = 10;
while (offset <= count){
List<Map<String,Object>> queryResult = dao.findUserName(offset,row);
for (int i=0;i<queryResult.size();i++){
Map<String,Object> data = queryResult.get(i);
//创建Document
Document doc = new Document();
//创建Field
Field userid = new Field("userid",data.get("nid").toString(),TextField.TYPE_STORED);
Field username = new Field("username",data.get("susername").toString(),TextField.TYPE_STORED);
Field truename = new Field("truename",data.get("struename").toString(),TextField.TYPE_STORED);
//填充Document
doc.add(userid);
doc.add(username);
doc.add(truename);
//创建索引库
writer.addDocument(doc);
/*提交事务*/
writer.commit();
}
offset = offset + row;
}
}catch (IOException e){
e.printStackTrace();
}finally {
/*关闭流*/
try {
writer.close();
System.out.println("writer流已关闭。。。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
查询索引
/**
* 查询索引
* @param field
* @param value
* @return
*/
public List<Map<String,Object>> read(String field,String value){
List<Map<String,Object>> list = new ArrayList<>();
try {
Directory directory = FSDirectory.open(Paths.get(indexDir));
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
// QueryParser parser = new QueryParser(field,analyzer);
Query query = getBooleanQuery();
TopDocs topDocs = searcher.search(query,5);
Long count = topDocs.totalHits;
System.out.println("总共查到"+count+"个文档");
for (ScoreDoc doc : topDocs.scoreDocs){
Document document = searcher.doc(doc.doc);
System.out.println(document.get(field)+"评分是"+doc.score);
Map<String,Object> map = new HashMap<>();
map.put("userid",document.get(field));
list.add(map);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
/**
* 通配符搜索,?表示一个字符,*表示0或多个
* 作用和数据库模糊搜索的like相似
* @param field
* @param value
* @return
*/
private Query getWildcardQuery(String field,String value){
String keyword = "*"+value+"*";
Term term = new Term(field,keyword);
WildcardQuery query = new WildcardQuery(term);
return query;
}
/**
* 模糊搜索
* @param field
* @param value
* @return
*/
private Query getFuzzyQuery(String field,String value){
Term term = new Term(field,value);
FuzzyQuery query = new FuzzyQuery(term);
return query;
}
/**
* 精确搜索
* @param field
* @param value
* @return
*/
private Query getTermQuery(String field,String value){
Term term = new Term(field,value);
TermQuery query = new TermQuery(term);
return query;
}
/**
* 多条件查询
* @return
*/
private Query getBooleanQuery(){
String field1 = "userid";
String value1 = "231";
String field2 = "username";
String value2 = "admin";
Query query1 = new TermQuery(new Term(field1,value1));
Query query2 = new TermQuery(new Term(field2,value2));
BooleanQuery.Builder builder = new BooleanQuery.Builder();
//SHOULD+SHOULD,表示“or”
// builder.add(query1,BooleanClause.Occur.SHOULD);
// builder.add(query2,BooleanClause.Occur.SHOULD);
//MUST+MUST,表示“and”
// builder.add(query1,BooleanClause.Occur.MUST);
// builder.add(query2,BooleanClause.Occur.MUST);
//MUST+MUST_NOT,表示MUST查询的结果不包含MUST_NOT查询的结果
// builder.add(query1,BooleanClause.Occur.MUST);
// builder.add(query2,BooleanClause.Occur.MUST_NOT);
//FILTER,通过过滤将评分改为0.0
// builder.add(query1,BooleanClause.Occur.FILTER);
BooleanQuery booleanQuery = builder.build();
return booleanQuery;
}