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;@Beforepublic void init() throws Exception {indexReader = DirectoryReader.open(FSDirectory.open(new File("D:\\java\\Java源码\\Lucene\\indexlib").toPath()));indexSearcher = new IndexSearcher(indexReader);}@Testpublic void testRangeQuery() throws Exception{Query query = LongPoint.newRangeQuery("size", 10L, 100L); long类型的 10 到100TopDocs topDocs = indexSearcher.search(query, 10);System.out.println("总记录数:" + topDocs.totalHits);ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc doc:scoreDocs){//取文档idint 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;@Beforepublic void init() throws Exception{indexWriter=new IndexWriter(FSDirectory.open(new File("D:\\java\\Java源码\\Lucene\\indexlib").toPath()),new IndexWriterConfig(new IKAnalyzer()));}添加新的文档@Testpublic 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();}删除全部文档@Testpublic void deleteAllDocument() throws Exception {indexWriter.deleteAll();indexWriter.close();}/*** 删除域中包含指定关键字的文档* @throws Exception*/@Testpublic void deleteDocumentByQuery() throws Exception {indexWriter.deleteDocuments(new Term("name", "apache"));indexWriter.close();}/*** 更新 域为name 包含关键字spring 的文档,即先删除 再添加* @throws Exception*/@Testpublic 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;@Beforepublic void init() throws Exception{indexReader= DirectoryReader.open(FSDirectory.open(new File("D:\\java\\Java源码\\Lucene\\indexlib").toPath()));indexSearcher = new IndexSearcher(indexReader);}@Testpublic 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){//取文档idint 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(分数);