Lucene 3.6.2入门(9) 高级搜索之自定义QueryParser

package com.jadyer.lucene;  

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;  

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;  

import com.jadyer.custom.MyQueryParser;  

/**
 * 【Lucene3.6.2入门系列】第09节_高级搜索之自定义QueryParser
 * @create Aug 19, 2013 2:07:32 PM
 * @author 玄玉<http://blog.csdn.net/jadyer>
 */
public class AdvancedSearch {
    private Directory directory;
    private IndexReader reader;  

    public AdvancedSearch(){
        /**文件大小*/
        int[] sizes = {90, 10, 20, 10, 60, 50};
        /**文件名*/
        String[] names = {"Michael.java", "Scofield.ini", "Tbag.txt", "Jack", "Jade", "Jadyer"}; 

        /**文件内容*/
        String[] contents = {"my java blog is http://blog.csdn.net/jadyer",
                             "my Java Website is http://www.jadyer.cn",
                             "my name is jadyer",
                             "I am a Java Developer",
                             "I am from Haerbin",
                             "I like java of Lucene"};
        /**文件日期*/
        Date[] dates = new Date[sizes.length];
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
        IndexWriter writer = null;
        Document doc = null;
        try {
            dates[0] = sdf.parse("20130407 15:25:30");
            dates[1] = sdf.parse("20130407 16:30:45");
            dates[2] = sdf.parse("20130213 11:15:25");
            dates[3] = sdf.parse("20130808 09:30:55");
            dates[4] = sdf.parse("20130526 13:54:22");
            dates[5] = sdf.parse("20130701 17:35:34");
            directory = FSDirectory.open(new File("myExample/01_index/"));
            writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36, new 

StandardAnalyzer(Version.LUCENE_36)));
            writer.deleteAll();
            for(int i=0; i<sizes.length; i++){
                doc = new Document();
                doc.add(new NumericField("size",Field.Store.YES, true).setIntValue(sizes[i]));
                doc.add(new Field("name", names[i], Field.Store.YES, 

Field.Index.ANALYZED_NO_NORMS));
                doc.add(new Field("content", contents[i], Field.Store.NO, 

Field.Index.ANALYZED));
                doc.add(new NumericField("date", Field.Store.YES, true).setLongValue(dates

[i].getTime()));
                writer.addDocument(doc);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(null != writer){
                try {
                    writer.close();
                } catch (IOException ce) {
                    ce.printStackTrace();
                }
            }
        }
    }  

    /**
     * 获取IndexReader实例
     */
    private IndexReader getIndexReader(){
        try {
            if(reader == null){
                reader = IndexReader.open(directory);
            }else{
                //if the index was changed since the provided reader was opened, open and return a new reader; else,return null
                //如果当前reader在打开期间index发生改变,则打开并返回一个新的IndexReader,否则返回null
                // http://www.bianceng.cn
                IndexReader ir = IndexReader.openIfChanged(reader);
                if(ir != null){
                    reader.close(); //关闭原reader
                    reader = ir;    //赋予新reader
                }
            }
            return reader;
        }catch(Exception e) {
            e.printStackTrace();
        }
        return null; //发生异常则返回null
    }  

    /**
     * 自定义QueryParser的搜索
     * @param expr 搜索的表达式
     */
    public void searchByCustomQueryParser(String expr){
        IndexSearcher searcher = new IndexSearcher(this.getIndexReader());
        QueryParser parser = new MyQueryParser(Version.LUCENE_36, "content", new StandardAnalyzer(Version.LUCENE_36));
        try {
            Query query = parser.parse(expr);
            TopDocs tds = searcher.search(query, 10);
            for(ScoreDoc sd : tds.scoreDocs){
                Document doc = searcher.doc(sd.doc);
                System.out.print("文档编号=" + sd.doc + "  文档权值=" + doc.getBoost() + "  文档评分=" + sd.score + "    ");
                System.out.println("size=" + doc.get("size") + "  date=" + new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date(Long.parseLong(doc.get("date")))) + "  name=" + doc.get

("name"));
            }
        } catch (ParseException e) {
            System.err.println(e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(null != searcher){
                try {
                    searcher.close(); //记得关闭IndexSearcher
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }  

    /**
     * 测试一下搜索效果
     */
    public static void main(String[] args) {
        AdvancedSearch advancedSearch = new AdvancedSearch();
        advancedSearch.searchByCustomQueryParser("name:Jadk~");
        advancedSearch.searchByCustomQueryParser("name:Ja??er");
        System.out.println("------------------------------------------------------------------------");
        advancedSearch.searchByCustomQueryParser("name:Jade");
        System.out.println("------------------------------------------------------------------------");
        advancedSearch.searchByCustomQueryParser("name:[h TO n]");
        System.out.println("------------------------------------------------------------------------");
        advancedSearch.searchByCustomQueryParser("size:[20 TO 80]");
        System.out.println("-------------------------------------------------------------------

-----");
        advancedSearch.searchByCustomQueryParser("date:[20130407 TO 20130701]");
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, lucene分组统计
, lucene
, apache
, parse
, import
, simpledateformat
.sdf文件
lucene queryparser、lucene 6 queryparser、lucene5 queryparser、lucene htmlparser、lucene parser,以便于您获取更多的相关知识。

时间: 2024-10-30 14:50:40

Lucene 3.6.2入门(9) 高级搜索之自定义QueryParser的相关文章

Lucene 3.6.2入门(8) 高级搜索之自定义评分

  package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.util.Random; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; i

Lucene 3.6.2入门(7) 高级搜索之普通Filter和自定义Filter

package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.luce

Lucene 3.6.2入门(6) 高级搜索之排序

package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.

Word入门动画教程11:搜索文档之高级搜索

如果用户知道文档的某些更详细的资料(属性),可以使用高级文件搜索,这样能精确地找到符合条件的文件.步骤如下: 1.选择"文件"菜单的"搜索..."命令,打开"基本文件搜索"任务窗格,单击"请参阅"下的"高级文件搜索",切换到"高级文件搜索"任务窗格. 2.在"属性"下拉列表框中选择文档的某个属性;在"值"文本框中输入一个能与此属性的真实值进行比较的

搜索引擎Bing必应高级搜索使用技巧

微软的搜索引擎Bing"必应"提供了非常丰富的高级搜索语法,使用高级关键字可获取更好的搜索结果,让你快速找到真正需要的内容,下面就让我们来了解一下吧. 使用以下关键字可以缩小搜索范围:   关键字 定义 示例 contains: 只搜索包含指定文件类型的链接的网站. 若要搜索包含MicrosoftWindowsMediaAudio(.wma)文件链接的网站,请键入:音乐contains:wma filetype: 仅返回以指定文件类型创建的网页. 若要查找以PDF格式创建的报表,请键入

解读SEO实战密码 高级搜索指令

做为一名合格的seo优化人员除了会用搜索引擎搜索普通关键词外,还必须了解一些特殊的高级搜索指令,一般很少人用到,但是对于seoer来说则是研究竞争对手和寻找外链资源的源泉.下面来由"彼岸"为大家揭开高级搜索指令的秘密: 1:双引号:("") 在搜索引擎中将你要搜索的关键词放在双引号中,代表完全匹配搜索,换句话来说也就是搜索返回的结果中必须包含双引号中出现的所有词,顺序也必须完全匹配,因此说此方法对于seoer来说更能够精确的找到特定关键词的竞争对手,便于分析和研究竞

SEO工作者必知必会的6种高级搜索指令

SEO工作者是最常接触搜索引擎高级指令的用户群之一,例如大家都知道用site查看自己网站的收录情况,用domain查看页面反链,但是大部分SEO工作者并未受过专业训练,基本功不扎实,很少使用其它的高级指令或是指令组合应用的方式来帮助自己掌握更详尽的情况,所以,在此总结了六种常见的高级搜索指令并通过实例来探讨它们对SEO工作的帮助,希望抛砖引玉,大家有更好的想法可以与我交流QQ:529608882. 1.site:用于搜索某个域名下被搜索引擎收录的所有页面. 例如搜索"site:xxx.com.c

win7高级搜索在哪?

  方法一.资源管理器直接搜索 点击桌面的"计算机"在windows资源管理器的右上角就有一个搜索框.也可以直接按住"快捷键F3"就可以跳出搜索框进行搜索.其中还可以添加"搜索筛选器",比如修改日期.文件大小的方式来进行筛选搜索.打开选中到你要搜索的盘符或文件夹,然后在右上角的搜索框输入关键字就行了,会自动搜索关键字.如图所示: 方法二.开始菜单高级搜索 在开始菜单上面,最下面也是有搜索框,也是可以在上面搜索文件,这个开始"菜单的&qu

新浪微博如何使用微博高级搜索?

  微博搜索结果默认显示50页,如果想要更精确的搜索结果,请使用微博搜索-高级搜索,搜索按钮后有"高级搜索"按钮,点击即可设置搜索条件,如微博类型.时间.地点等.