Lucene&Solr(之二)-索引库CRUD、Solr的安装

来源:互联网 发布:linux查看telnet服务 编辑:程序博客网 时间:2024/06/05 02:01

Lucene索引库的维护

首先getIndexWriter
private IndexWriter getIndexWriter() throws Exception {Directory directory = FSDirectory.open(new File("F:\\index"));IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, new IKAnalyzer());// 创建indexWriterIndexWriter indexWriter = new IndexWriter(directory, config);return indexWriter;}

索引库的添加
@Test// 索引库的添加public void addDocument() throws Exception {IndexWriter indexWriter = getIndexWriter();// 创建document对象Document document = new Document();Field name = new TextField("name", "apache.txt", Store.YES);name.setBoost(10.0f);// 设置相关度document.add(name);document.add(new TextField("name1", "我是name1", Store.YES));document.add(new TextField("name2", "我是name2", Store.YES));document.add(new LongField("content", 1000l, Store.NO));// 添加document'到索引库indexWriter.addDocument(document);// 关闭indexWriter.close();}
索引库的删除
@Test// 删除所有  注:慎用慎用!public void deleteAllDocument() throws Exception {IndexWriter indexWriter = getIndexWriter();indexWriter.deleteAll();indexWriter.commit();indexWriter.close();}

条件的删除
@Test// 指定查询条件删除public void deleteDocumentByQuery() throws Exception {IndexWriter indexWriter = getIndexWriter();// 创建查询条件Query query = new TermQuery(new Term("name", "apache"));indexWriter.deleteDocuments(query);indexWriter.close();}


索引库的修改
@Test// 修改索引库 原理:先删除再添加public void updateDocument() throws Exception {IndexWriter indexWriter = getIndexWriter();// 创建 documentDocument document = new Document();document.add(new TextField("name", "更新了的文档",Store.YES));document.add(new TextField("content", "这个文档被更新了",Store.YES));indexWriter.updateDocument(new Term("name", "apache"), document);indexWriter.close();}

Field域的属性

1、是否分析:是否要对域中的内容进行分词。
判断标准:是否要对域的内容进行分词。
2、是否索引:域中的内容是否要进行索引,如果不索引查询不到结果。
判断标准:是否要在域上进行查询。如果要查询就需要创建索引。
3、是否存储:是否把域的中的原始内容保存到磁盘。如果不存储域中是取不到结果的。

判断标准:是否要展示给用户看,或者业务逻辑中是否需要域的内容。

以此来进行field的子类的选择。( StringField、LongField、StoredField、TextField )




索引库的查询

对要搜索的信息创建Query对象,可通过两种方法创建查询对象。
首先抽取通用代码:
private IndexSearcher getIndexSearcher() throws Exception {IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("F:\\index")));IndexSearcher indexSearcher = new IndexSearcher(indexReader);return indexSearcher;}private void printResult(Query query) throws Exception {IndexSearcher indexSearcher = getIndexSearcher();TopDocs topDocs = indexSearcher.search(query, 10);System.out.println("查询的总记录数:" + topDocs.totalHits);for (ScoreDoc scoreDoc : topDocs.scoreDocs) {int id = scoreDoc.doc;Document document = indexSearcher.doc(id);// 取field的值System.out.println("==============================================================================");System.out.println(document.get("id"));System.out.println(document.get("name"));System.out.println("content:" + document.get("content"));System.out.println(document.get("path"));System.out.println(document.get("size"));}indexSearcher.getIndexReader().close();}


1、使用lucene提供的Query子类
使用TermQuery进行查询:
@Test// 创建TermQuery查询public void testQueryTerm() throws Exception {Query query = new TermQuery(new Term("name", "apache"));System.out.println(query);// name:nameprintResult(query);}
查询所有:MatchAllDocsQuery
@Test// 查询所有public void testMatchAllDocsQuery() throws Exception {Query query = new MatchAllDocsQuery();System.out.println(query);// *:*printResult(query);}
根据数值范围查询:NumericRangeQuery
@Test// 数值范围查询public void testNumericRangeQuery() throws Exception {Query query = NumericRangeQuery.newLongRange("size", 0l, 3000l, true, true);System.out.println(query);// size:[0 TO 3000]printResult(query);}

BooleanQuery:组合条件查询,可以指定多个查询条件:
@Test// 多条件查询public void testBooleanQuery() throws Exception {BooleanQuery query = new BooleanQuery();// 设置 条件Query query1 = new TermQuery(new Term("name", "apache"));Query query2 = NumericRangeQuery.newLongRange("size", 0l, 3000l, true, false);// 组合query.add(query1, Occur.MUST);query.add(query2, Occur.MUST_NOT);System.out.println(query);// +name:apache +size:[0 TO 3000}printResult(query);}
条件直接的关系:
Occur.MUST:条件必须满足,相当于AND
Occur.SHOULD:条件应该满足,相当于OR
Occur.MUST_NOT:条件必须不能满足,相当于NOT


2、使用QueryParse解析查询表达式
先导入queryparser的jar包:在lucene目录下的扩展包中
@Test// 分析查询时,默认域的查询public void testQueryParser() throws Exception {// 参数1: 默认搜索的域   参数2:分析器QueryParser queryParser = new QueryParser("content", new IKAnalyzer());Query query = queryParser.parse("Lucene is a apache project");System.out.println(query);// content:lucene content:apache content:project   is和a为停用词printResult(query);}
@Test// 分析查询时,默认域的查询public void testQueryParser() throws Exception {// 参数1: 默认搜索的域   参数2:分析器QueryParser queryParser = new QueryParser("name", new IKAnalyzer());Query query = queryParser.parse("name:apache");System.out.println(query);printResult(query);}


多个默认搜索域:
@Test// 多个默认搜索域public void testMulTiFieldQuery() throws Exception {String[] fields = {"name","content"};MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());Query query = queryParser.parse("Lucene is a apache project");System.out.println(query);// (name:lucene content:lucene) (name:apache content:apache) (name:project content:project)printResult(query);}

Lucene的查询语法:

1、基本语法:域名:关键字
如:   name:apache
2、查询所有文档
*:*
3、范围查询语法:域名:[ 最小值 TO 最大值 ]
[ ]:包含边界值
{ }:不包含边界值
如:size:[ 0 TO 1000 ]
注:在lucene中范围查询只支持字符串类型,数值范围使用NumericRangeQuery。Solr中是支持的。

4、组合条件查询语法
+name:apache +size:[1000 TO 10000]+:相当于AND
name:apache size:[1000 TO 10000]没有前缀:相当于OR
-name:apache size:[1000 TO 10000]-:相当于NOT

第二种写法:
name:apache AND size:[1000 TO 10000]
name:apache OR size:[1000 TO 10000]
NOT name:apache size:[1000 TO 10000]


相关度排序

相关度排序是查询结果按照查询关键字的相关性进行排序。越相关的越靠前。

相关度打分:
1、计算词的(term)的权重
2、根据权重值,采用空间向量模型算法计算文档相关度得分。

影响term权重的两个因素:
Term Frequency(tf):
指term在文档中出现了多少次。tf越大说明越重要。

Document Frequency(df):
指有多少文档包含此term。df越大说明越不重要。

设置boost影响得分结果:
@Test// 索引库的添加public void addDocument() throws Exception {IndexWriter indexWriter = getIndexWriter();// 创建document对象Document document = new Document();Field name = new TextField("name", "apache.txt", Store.YES);name.setBoost(10.0f);// 设置相关度document.add(name);document.add(new TextField("name1", "我是name1", Store.YES));document.add(new TextField("name2", "我是name2", Store.YES));document.add(new LongField("content", 1000l, Store.NO));// 添加document'到索引库indexWriter.addDocument(document);// 关闭indexWriter.close();}


Solr安装及配置

从官方网站下载Solr

Solr的安装步骤:

1、安装tomcat
2、把solr目录中dist下的war包部署到tomcat下,并改名为便于访问的solr.war。
3、启动tomcat以使solr.war包自动解压。再关闭tomcat后,删除war包。
4、把Solr目录下example\lib\ext目录下的jar包添加到solr工程中,日志相关。
5、配置磁盘索引库solrhome,solr服务器所有配置文件保存的目录。在example下的solr目录就是一个solrhome。
将这个目录复制到自定义的路径,并改名为solrhome。改名只是便于理解……
6、配置solr工程和solrhome之间的关系,告诉solr工程solrhome的位置:
修改solr工程的web.xml:解开注释,并修改value值。
    <env-entry>       <env-entry-name>solr/home</env-entry-name>       <env-entry-value>D:\develop\solrhome</env-entry-value>       <env-entry-type>java.lang.String</env-entry-type>    </env-entry>

7、启动tomcat


Solr的后台管理界面














待续……




0 0
原创粉丝点击