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(分數);