对于索引,可能入门的程序不够印象深刻,这里直接将增删查改事例贴出来,加深理解。其实也为了更好地使用好Solr做个基础知识,索引库依旧是入门时候的那个目录地址
相应API解析:CRUD
添加:
indexWriter.addDocument();/** 创建索引库存储目录 */
Directory directory = FSDirectory.open(new File("D:\\Lucene4\\lucene_index"));
/** 创建分词器(单字分词器) */
Analyzer analyzer = new StandardAnalyzer();
/** 创建写索引需要的配置信息对象 */
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
/** 设置打开索引库的模式 */
indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
/**
* 创建IndexWriter对象(对索引库做CUD操作)
* 第一个参数:索引库存储目录
* 第二个参数:写索引需要的配置信息对象
* */
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
/** 创建文档 */
Document doc = new Document();
doc.add(new StringField("id", "9", Store.YES));
doc.add(new TextField("name", "李天一", Store.YES));
doc.add(new IntField("age", 20, Store.YES));
/** 添加文档 */
indexWriter.addDocument(doc);
indexWriter.commit();
indexWriter.close();
修改:
indexWriter.updateDocument();/** 创建索引库存储目录 */
Directory directory = FSDirectory.open(new File("D:\\Lucene4\\lucene_index"));
/** 创建分词器(单字分词器) */
Analyzer analyzer = new StandardAnalyzer();
/** 创建写索引需要的配置信息对象 */
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
/** 设置打开索引库的模式 */
indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
/**
* 创建IndexWriter对象(对索引库做CUD操作)
* 第一个参数:索引库存储目录
* 第二个参数:写索引需要的配置信息对象
* */
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
/** 创建文档 */
Document doc = new Document();
doc.add(new StringField("id", "9", Store.YES));
doc.add(new TextField("name", "李双江", Store.YES));
doc.add(new IntField("age", 70, Store.YES));
/** 修改文档 */
indexWriter.updateDocument(new Term("id", "9"), doc);
indexWriter.commit();
indexWriter.close();
删除:
indexWriter.deleteDocuments();//条件删除
/** 条件删除索引 */
@Test
public void delete() throws Exception{
/** 创建索引库存储目录 */
Directory directory = FSDirectory.open(
new File("D:\\Lucene4\\lucene_index"));
/** 创建分词器(单字分词器) */
Analyzer analyzer = new StandardAnalyzer();
/** 创建写索引需要的配置信息对象 */
IndexWriterConfig indexWriterConfig = new
IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
/** 设置打开索引库的模式 */
indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
/**
* 创建IndexWriter对象(对索引库做CUD操作)
* 第一个参数:索引库存储目录
* 第二个参数:写索引需要的配置信息对象
* */
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
/** 删除索引 */
indexWriter.deleteDocuments(new Term("id", "9"));
indexWriter.commit();
indexWriter.close();
}
/** 创建索引库存储目录 */
Directory directory = FSDirectory.open(new File("D:\\Lucene4\\lucene_index"));
/** 创建分词器(单字分词器) */
Analyzer analyzer = new StandardAnalyzer();
/** 创建写索引需要的配置信息对象 */
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
/** 设置打开索引库的模式 */
indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
/**
* 创建IndexWriter对象(对索引库做CUD操作)
* 第一个参数:索引库存储目录
* 第二个参数:写索引需要的配置信息对象
* */
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
/** 删除全部索引 */
indexWriter.deleteAll();
indexWriter.commit();
indexWriter.close();
查询:IndexReader
IndexReader indexReader = DirectoryReader.open(directory);读取索引库:
/** 创建索引库存储目录 */
Directory directory = FSDirectory.open(new File("D:\\Lucene4\\lucene_index"));
/** 创建IndexReader读索引库对象 */
IndexReader indexReader = DirectoryReader.open(directory);
System.out.println("总数量: " + indexReader.maxDoc());
System.out.println("总数量: " + indexReader.numDocs());
/** 迭代索引号 */
for (int i = 0; i < indexReader.maxDoc(); i++){
/** 获取文档 */
Document doc = indexReader.document(i);
System.out.println(doc.get("id") + "\t" + doc.get("content"));
}
/** 关闭IndexReader */
indexReader.close();
按条件查询
/**
* 从索引库中检索
* @author LEE.SIU.WAH
* @email lixiaohua7@163.com
* @version 1.0
*/
public class IndexSearcherTest {
/** 检索数据 */
@Test
public void test() throws Exception{
/** 创建读索引库对象 */
IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("D:\\传智播客\\Lucene4\\lucene_index")));
/** 创建IndexSearcher对象 */
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
/** 创建查询对象(检索条件) */
Query query = new TermQuery(new Term("content", "我"));
/** 进行检索,返回最前面的5条记录 */
TopDocs topDocs = indexSearcher.search(query, 5);
Query查询对象
TermQuery关键字查询
Query query1 = new TermQuery(new Term("content", "徐若"));
PrefixQuery前缀查询
Query query2 = new PrefixQuery(new Term("content", "徐"));
FuzzyQuery相似度查询
Query query3 = new FuzzyQuery(new Term("filePath", "luce"));
NumericRangeQuery数字范围查询
/**
* NumericRangeQuery数字范围查询
* 第一个参数:字段名
* 第二个参数:最小值
* 第三个参数:最大值
* 第四个参数:是否包含最小值
* 第五个参数:是否包含最大值
*/
Query query4 = NumericRangeQuery.newIntRange("int", 20, 40, false, false);
Query query5 = NumericRangeQuery.newFloatRange("float", 101.0f, 202.0f, true, true);
BooleanQuery布尔查询
/** BooleanQuery布尔查询 (用来组装多个Query) **/
BooleanQuery bool = new BooleanQuery();
bool.add(query3, Occur.MUST); // 必须出现
bool.add(query2, Occur.MUST_NOT); // 必须不能出现
bool.add(query1, Occur.SHOULD); // 有可能出现
把字符串解释成Query对象(添加依赖)
说明:依赖jar包(lucene-queryparser-4.10.3.jar)
<!-- lucene-queryparser -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>4.10.3</version>
</dependency>
查询字符串格式:
jack 默认Field里包含jack关键词jack london (jack OR london) 默认Field里包含jack或london
+jack +london (jack AND london) 默认Field里包含jack和london
name:jack Name Field里包含jack
name:jack -city:london (name:jack AND NOT city:london) (Name里包含jack,但city里不能包含london)
price:[10.5 TO 2000.5] 位于指定范围内(包含下限与上限)
price:{10.5 TO 2000.5} 位于指定范围内(不包含下限与上限)
/** 定义分词器 */
Analyzer analyzer = new IKAnalyzer();
/** 创建QueryParser对象 */
QueryParser qp = new QueryParser("content", analyzer);
/** 爱 默认Field里包含"爱"关键词 */
Query query1 = qp.parse("爱");
/** 爱 我们 (爱 OR 我们) 默认Field里包含"爱"或"我们" */
Query query2 = qp.parse("爱 我们");
Query query3 = qp.parse("爱 OR 我们");
/** +爱 +徐若 (爱 AND 徐若) 默认Field里包含"爱"和"徐若" */
Query query4 = qp.parse("+爱 +徐若");
Query query5 = qp.parse("爱 AND 徐若");
/** filePath:lucene AND content:徐若 filePath里包含"lucene"和 content里包含"徐若" */
Query query6 = qp.parse("filePath:lucene AND content:徐若");
/**
* filePath:lucene -content:徐若 (filePath:lucene AND NOT content:徐若)
* (filePath里包含lucene,但content里不能包含"徐若")
*/
Query query7 = qp.parse("filePath:lucene -content:徐若");
Query query8 = qp.parse("filePath:lucene AND NOT content:徐若");
/** content:{20 TO 90} content:[20 TO 90] */
Query query9 = qp.parse("content:{20 TO 90}");