StringField N Y N or Y 比如:手机号、身份证号
LongField Y Y N or Y 比如:商品的价格、文件大小
StoredField N N Y 比如:网页地址URL、文件路径
TextFiled Y Y N or Y 比如:网页内容、文件内容
Field类 | 数据类型 | Analyzed 是否分析 | Indexed 是否索引 | Stored 是否存储 | 说明 |
StringField(FieldName, FieldValue,Store.YES)) | 字符串 | N | Y | Y或N | 这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如(订单号,姓名等) 是否存储在文档中用Store.YES或Store.NO决定 |
LongPoint(String name, long... point) | Long型 | Y | Y | N | 可以使用LongPoint、IntPoint等类型存储数值类型的数据。让数值类型可以进行索引。但是不能存储数据,如果想存储数据还需要使用StoredField。 |
StoredField(FieldName, FieldValue) | 重载方法,支持多种类型 | N | N | Y | 这个Field用来构建不同类型Field 不分析,不索引,但要Field存储在文档中 |
TextField(FieldName, FieldValue, Store.NO) 或 TextField(FieldName, reader)
| 字符串 或 流 | Y | Y | Y或N | 如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略. |
使用 LongPoint
对文件大小的 范围 索引
private IndexReader indexReader;
private IndexSearcher indexSearcher;
@Before
public void init() throws Exception {
indexReader = DirectoryReader.open(FSDirectory.open(new File("D:\\java\\Java源码\\Lucene\\indexlib").toPath()));
indexSearcher = new IndexSearcher(indexReader);
}
@Test
public void testRangeQuery() throws Exception{
Query query = LongPoint.newRangeQuery("size", 10L, 100L); long类型的 10 到100
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("总记录数:" + topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc doc:scoreDocs){
//取文档id
int docId = doc.doc;
//根据id取文档对象
Document document = indexSearcher.doc(docId);
System.out.println(document.get("name"));
System.out.println(document.get("path"));
System.out.println(document.get("size")); 创建时使用了 StoredField 才能取出
//System.out.println(document.get("content"));
System.out.println("-----------------寂寞的分割线");
}
indexReader.close();
}
注意不存储 不代表不能被索引 只是不能取出这个文档的 的域的值
增删改
public class IndexManager {
private IndexWriter indexWriter;
@Before
public void init() throws Exception{
indexWriter=new IndexWriter(FSDirectory.open(new File("D:\\java\\Java源码\\Lucene\\indexlib").toPath()),
new IndexWriterConfig(new IKAnalyzer()));
}
添加新的文档
@Test
public void testAddDocument() throws Exception{
//创建一个Document对象
Document document = new Document();
//向document对象中添加域
document.add(new TextField("name", "新添加的文件", Field.Store.YES));
document.add(new TextField("content", "新添加的文件内容", Field.Store.NO));
document.add(new StoredField("path", "c:/temp/helo"));
// 把文档写入索引库
indexWriter.addDocument(document);
//关闭索引库
indexWriter.close();
}
删除全部文档
@Test
public void deleteAllDocument() throws Exception {
indexWriter.deleteAll();
indexWriter.close();
}
/**
* 删除域中包含指定关键字的文档
* @throws Exception
*/
@Test
public void deleteDocumentByQuery() throws Exception {
indexWriter.deleteDocuments(new Term("name", "apache"));
indexWriter.close();
}
/**
* 更新 域为name 包含关键字spring 的文档,即先删除 再添加
* @throws Exception
*/
@Test
public void updateDocument() throws Exception {
//创建一个新的文档对象
Document document = new Document();
//向文档对象中添加域
document.add(new TextField("name", "更新之后的文档", Field.Store.YES));
document.add(new TextField("name1", "更新之后的文档2", Field.Store.YES));
document.add(new TextField("name2", "更新之后的文档3", Field.Store.YES));
//更新操作
indexWriter.updateDocument(new Term("name", "spring"), document);
//关闭索引库
indexWriter.close();
}
}
查询语法
1) TermQuery 语法: name:apache
2)、MatchAllDocsQuery 语法: *:*
3)、NumericRangeQuery 语法: size:[100 TO 1000] 但是luke不支持数值的范围查询 solr支持的
支持复合查询
Query query = new BooleanQuery( )
Query query1 = new TermQuery(new Term("name", "apache"));
Query query2 = new TermQuery(new Term("content", "spring"));
query.add(query1, Occur.MUST);
query.add(query2, Occur.MUST); 语法: +name:apache +content:spring and
query.add(query1, Occur.MUST);
query.add(query2, Occur.SHOULD);语法: +name:apache content:spring or
query.add(query1, Occur.MUST);
query.add(query2, Occur.MUST_NOT); 语法: +name:apache -content:spring
query.add(query1, Occur.MUST_NOT);
query.add(query2, Occur.MUST_NOT); 此查询无意义
Queryparser
1.当需要对 索引的关键字进行分词 再查找索引时使用 列如百度输入输入一句话进行搜索 需要jar包:
lucene-queryparser-7.4.0.jar
2.查询content域中 包含对 这句 "lucene是一个Java开发的全文检索工具包" 话分词后的关键字的文档对象
public class parseQurey {
private IndexReader indexReader;
private IndexSearcher indexSearcher;
@Before
public void init() throws Exception{
indexReader= DirectoryReader.open(FSDirectory.open(new File("D:\\java\\Java源码\\Lucene\\indexlib").toPath()));
indexSearcher = new IndexSearcher(indexReader);
}
@Test
public void testQueryParser() throws Exception {
//创建一个QueryPaser对象,两个参数
QueryParser queryParser = new QueryParser("content", new IKAnalyzer());
//参数1:默认搜索域,参数2:分析器对象
//使用QueryPaser对象创建一个Query对象
Query query = queryParser.parse("lucene是一个Java开发的全文检索工具包");
//执行查询
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("总记录数:" + topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc doc:scoreDocs){
//取文档id
int docId = doc.doc;
//根据id取文档对象
Document document = indexSearcher.doc(docId);
System.out.println(document.get("name"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
//System.out.println(document.get("content"));
System.out.println("-----------------寂寞的分割线");
}
indexReader.close();
}}
查询结果排序
三、相关度排序(竞价排序)
name:apache
apache lucene.txt
Apache_Lucene_README.txt
Welcome to the Apache Solr project.txt 按比重排序
打分:默认分值是1,设置越高排名靠前
Field.setBoost(分数);