Solr__luence(五)索引维护(crud),以及Query查询对象

对于索引,可能入门的程序不够印象深刻,这里直接将增删查改事例贴出来,加深理解。其实也为了更好地使用好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();
}



       indexWriter.deleteAll();//全部删除

/** 创建索引库存储目录 */
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}");




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值