zoukankan      html  css  js  c++  java
  • Lucene4.1 视频学习

    1.将路径建立在内存中 Directory d = new RAMDirectiry();


    2.Filed Index(索引选项):
    Index.ANALYZED:进行分词和索引,适应于标题,内容等
    Index.NOT_ANALYZED:进行索引,但是不进行分词,比如说身份证号,姓名等,用于精确查找
    Index.ANALYZED_NOT_NORMS 进行分词但不存储norm信息,该信息包括创建索引时间和权值等内容
    Index.NOT_ANALYZED_NOT_NORMS:不进行分词也不存储norm信息
    Index.NO 不进行索引

    3.IndexReader indexr = IndexReader.open(directory);
    读取文档数量 indexr.numDocs();
    文档总数量  indexr.maxDocs();
    删除的文档数量 indexr.numDeleteDocs();(通过deleteDcoument删除的文档不会彻底删除,保存在*.del文件中)
    可以按如下代码恢复通过deleteDocument删掉的文档:
    IndexReader index = IndexReader.open(directory,false);(布尔类型的值是设置readonly的)
    reader.undeleteAll();(此时文档恢复,*.del消失)

    通过forceMergeDeletes()删除的文档无法恢复(在3.5之前是通过optimize()方法来实现的,只不过消耗资源,3.5之后弃用)

    4.updateDocument 操作实际上为先删除后添加
    indexr.updateDocument(term,doc);
    term为要删除的内容,doc为添加的内容,故两者id可以不同

    5.添加数字类型的域 NumericField(String name , Store store ,boolean index)
    doc.add(new NumericField("content" , Field.Store.YES , true).setIntValue("value"));

    数字类型的范围查询

    Query queryPrice =  NumericRangeQuery.newDoubleRange(ProductIndexFields.price.toString(), Double.valueOf(priceFrom.trim()), Double.valueOf(priceTo.trim()), true, true); 参数表示的内容依次为下限,上限,下限区间的开闭,上限区间的开闭

    6.doc.setBoost();添加索引的时候设置boost ,然后存储在索引文件中
    search的时候获取boost是1.0 原因是两个document已经不同,一个是索引文件中存储的,一个是用search.doc(docId)获取的

    7.为了节省reader打开和关闭需要的时间,可以创建一个单例的indexReader,不进行关闭,
    也就是一个项目只有一个单独的indexReader
    private static IndexReader reader= null ;
    在构造方法内初始化reader即可
    然后可以在方法中如下写:(openIfChanged方法:如果reader发生变化,则重新打开新的reader , 否则返回null)
    if(reader == null){
        reader = IndexReader.open(directory);
    }else{
        IndexReader ir = IndexReader.openIfChanged(reader);
        reader.close();
        if(ir != null) reader = ir ;
    }
    即可实现动态建立reader,查看进行更新 删除后的结果

    也可以实现一个单独的indexWriter ,此时不能用indexWiter.close()来实现提交writer
    改变索引之后,需要indexWriter.commit()来实现数据的实时删除更新
    一般用writer删除索引内容

    查询:

    1.TermQuery(Term) 基本查询  精确匹配 有什么查什么
    2.TermRangeQuery(field , start , end , 开区间/闭区间 , 开区间/闭区间 ) 范围查询 无法查询numField的索引
    TermRangeQuery("name" , "a" ,"s" , true ,true )查询a开头s结尾的
    3.NumricRangeQuery 查询数字范围的 Query query = NumricRangeQuery.newIntRange(filed , end , 开区间/闭区间 , 开区间/闭区间)
    4.PrefixQuery(Term)  匹配每个单词的前缀(索引的时候会把一句话分成一个个单词)
    5.WildcardQuery(Term) 可以在传入的value中使用通配符 ? 一个字符 * 任意多个字符
    6.BooleanQuery 可以组合多个query
    7.PhraseQuery 短语查询 可以依靠一句话中的几个单词和中间隔的位置来查询
    PhraseQuery query = new PhraseQuery();
    query.setSlop(1); //设置中间隔的位置数
    query.add(new Term("content","i"));
    query.add(new Term("content","you")); 则可以查出 I love You(index 的时候会变成 i love you)等内容
    8.FuzzyQuery(Term) 模糊查询 可以匹配跟value有一个不同的模糊查询,最多两个
    比如 make , 可以查出 mike jake等内容 还有其他设置可以进行

    QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35))  
    Query query = parser.parse(keyword);
    对于keyword
    1.空格默认or  a b 就是包含a或者b  a AND b 就是包含a和b
    2.name:mike 在name中搜索含有mike的
    3.email:*@corezon.com 在email中查询以corezon邮箱结尾的(前提是设置parser.setAllowLeadingWildCard(true),
    不然*开头会使query消耗过大而默认关闭此情况);
    4.- name:mike +content:football: name中不含有mike ,但是content中含有football的
    5.id:[1 TO 3] :匹配id从1 到3闭区间  也就是 1 2 3
    6.id:(1 TO 3) :匹配id从1 到3开区间 也就是 2
    7.""i like football"" :匹配含有 i like football的  短语的匹配
    8.""i football"~1" :匹配i 和 like 之间有一个单词的
    以上内容只是匹配string类型的索引的

    从某一个ScoreDocs开始得到size为20的topdocs
    TopDocs td = searcher.searchAfter(lastsd,query,size)

    11.TokenStream 分词器做好处理之后得到的一个流,这个流中存储了分词的各种信息,
    可以通过TokenStream有效的获取分词单元信息
    Tokenier主要负责接收字符流reader ,将数据转化为语汇单元
    Tokenfilter 对已经分好的词进行过滤 比如大小写 ……


    12.主要的分词器:
    StandardAnalyzer StopAnalyzer WhitespaceAnalyzer SimpleAnalyzer

    13.自定义停词分词器
    中文分词器
    近义词分词器  需要熟悉

    14.设置排序之后  评分就是消失 默认是升序
    indexsearcher.search(quertstr,length,sort)
    Sort.INDEXORDER 通过doc的id进行排序
    Sort.RELEVANCE 使用默认的排序方式
    new SortField("size",SortFiled.INT)使用某个字段的内容排序 ,比如说size的大小
    new SortField("filename",SortFiled.STRING) 通过filename的首字母排序
    new SortField("filename",SortFiled.STRING,true) 设置降序排序 最后参数表示是否反转

    19.其他知识

     IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_41,analyzer);
            LogMergePolicy mergePolicy = new LogByteSizeMergePolicy();
            //达到3个文件时就和合并
            mergePolicy.setMergeFactor(3);
            iwc.setMergePolicy(mergePolicy);

    Field.Store 表示“是否存储”,即该Field内的信息是否要被原封不动的保存在索引中。
    Field.Index 表示“是否索引”,即在这个Field中的数据是否在将来检索时需要被用户检索到,一个“不索引”的Field通常仅是提供辅助信息储存的功能。
    Field.TermVector 表示“是否切词”,即在这个Field中的数据是否需要被切词。

    WildcardQuery与QueryParser不同的是:WildcardQuery的前缀可以为*,而QueryParser不行
    FuzzyQuery  可以查询有两个单词不同的

    // 多关键的搜索 PhrasePrefixQuery  
        public void phrasePrefixSearcher() throws IOException{  
             // 简言之,用第一个的term数组上面的每个内容匹配下面的term 
            IndexSearcher search = new IndexSearcher(directory);  
              
            PhrasePrefixQuery query = new PhrasePrefixQuery();  
              
            // 这里两项都有可能首先被匹配  
            query.add(new Term[]{new Term("content","would"),new Term("content","can")});  
              
            // 只有一项必须匹配  
            query.add(new Term("content","help"));  
              
            // If you would like to help promote OpenOffice  
            // can I help you  
            // slop因子的作用域为查询中的所有短语  
            query.setSlop(1);  
              
            // 匹配第一项为 would 或 can 第二项为help  
            // solp设置为1   
            // If you would like to help promote OpenOffice  除去if to 外,would与help的距离=1  
            // can I help you 的距离也=1  所以可以搜索出两条数据  
              
            Hits hits = search.search(query);  
              
            printResult(hits);  
              
            search.close();  
        }  
        Term t = new Term("content", "work"); 
                    FuzzyQuery query = new FuzzyQuery(t); 
                  //FuzzyQuery还有两个构造函数,来限制模糊匹配的程度 
                  // 在FuzzyQuery中,默认的匹配度是0.5,当这个值越小时,通过模糊查找出的文档的匹配程度就 
                   // 越低,查出的文档量就越多,反之亦然 
                    FuzzyQuery query1 = new FuzzyQuery(t, 0.1f); 
                    FuzzyQuery query2 = new FuzzyQuery(t, 0.1f, 1); 
            //第二个是设置匹配度,第三个是设置有多少个前缀字母完全匹配

    部分代码来源:http://callan.iteye.com/blog/153553

    setboost的运用:http://blog.csdn.net/yja886/article/details/6612104

  • 相关阅读:
    Pygal之掷骰子
    pygal之掷骰子 2颗面数为6的骰子
    matplotlib之scatter
    使用Flash Builder 4 beta和FlexUnit进行Test Driven Development
    FlexUnit单元测试(第二章FlexUnit基本应用)
    FlexUnit单元测试(第三章FlexUnit事件断言)
    [Flex]Flex SDK 4(Gumbo)更方便的自定义样式、自定义SparkSkin(二)
    Flex开源项目
    Flex 4 : Chart 控件
    Flex SDK 4(Gumbo)更方便的自定义样式、自定义SparkSkin(三)
  • 原文地址:https://www.cnblogs.com/cuiyf/p/3415419.html
Copyright © 2011-2022 走看看