Lucene 常用filed 使用 与索引库维护

    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

可以使用LongPointIntPoint等类型存储数值类型的数据。让数值类型可以进行索引。但是不能存储数据,如果想存储数据还需要使用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(分数);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值