lucene多种查询方式

lucene TermQuery搜索英文有结果,中文无结果 今天lucene项目中,精确搜索用了TermQuery,然而很失望,搜索不出来任何结果。 后来寻找原因,经过查找,发现可能是TermQuery只识别英文,对中文识别支持度不够好。 我特意在数据库中插入了一条英文记录,然后再次运行代码,发现的确仅插入的那条记录被搜索到了,验证了我上述猜测。 以前用的标准分词器 QueryParser queryParser = new QueryParser("c... 阅读详情

Lucene搜索方式大合集

1、IndexCreationTest类:Lucene搜索测试类

复制代码
package junit;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.math.NumberUtils;
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.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MultiPhraseQuery;
import org.apache.lucene.search.NumericRangeFilter;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.regex.RegexQuery;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;

import com.ljq.entity.Person;
import com.ljq.utils.Consts;
import com.ljq.utils.DateUtils;
import com.ljq.utils.LuceneUtil;
import com.ljq.utils.XMLPropertyConfig;

/**   
 * Lucene搜索方式大合集<br/><br/>
 * 
 * Lucene搜索种类很多。这里就介绍几个最常用的。其中TermQuery\BooleanQuery\RegexQuery功能最强大,最为常用。
 *
 * @author 林计钦
 * @version 1.0 2013-6-7 上午09:34:08   
 */
public class IndexQueryTest {
    
    /**
     * 词条搜索(单个关键字查找)<br/><br/>
     * 
     * 主要对象是TermQuery,调用方式如下:<br/>
     * Term term=new Term(字段名, 搜索关键字);<br/>
     * Query query=new TermQuery(term);<br/>
     * Hits hits=searcher.search(query);<br/>
     * @throws Exception
     */
    @Test
    public void termQuery() throws Exception {
        IndexReader reader = IndexReader.open(FSDirectory.open(new File(XMLPropertyConfig.getConfigXML().getString("index_path"))), true);
        IndexSearcher searcher = new IndexSearcher(reader);
        
        //Term term=new Term("ids", "1");
        //Term term=new Term("ages", "20");
        //Term term=new Term("birthdays", "2008-06-12");
        //Term term=new Term("name", "张三");
        Term term=new Term("city", "厦门");
        
        Query query=new TermQuery(term);
        TopDocs topDocs=searcher.search(query, 1000);
        System.out.println("共检索出 " + topDocs.totalHits + " 条记录");
        System.out.println();
        
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scDoc : scoreDocs) {
            Document document = searcher.doc(scDoc.doc);
            String id = document.get("id");
            String name = document.get("name");
            String age = document.get("age");
            String city = document.get("city");
            String birthday = document.get("birthday");
            float score = scDoc.score; //相似度
            
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s, 相关度:%s.", 
                    id, name, age, city, DateUtils.longToString(Long.parseLong(birthday), Consts.FORMAT_SHORT), score));
        }
        
        searcher.close();
        reader.close();
    }
    
    /**
     * 组合搜索(允许多个关键字组合搜索)<br/><br/>
     * 
     * 主要对象是BooleanQuery,调用方式如下:<br/>
     * Term term1=new Term(字段名, 搜索关键字);<br/>
     * TermQuery query1=new TermQuery(term1);<br/><br/>
     * 
     * Term term2=new Term(字段名, 搜索关键字);<br/>
     * TermQuery query2=new TermQuery(term2);<br/><br/>
     * 
     * BooleanQuery booleanQuery=new BooleanQuery();<br/>
     * booleanQuery.add(query1, 参数);<br/>
     * booleanQuery.add(query2, 参数);<br/><br/>
     * 
     * Hits hits=searcher.search(booleanquery);<br/>
     * 此方法中的核心在BooleanQuery的add方法上,其第二个参数有三个可选值,对应着逻辑上的与或非关系。<br/><br/>
     * 
     * 参数如下:<br/>
     * BooleanClause.Occur.MUST:必须包含,类似于逻辑运算的与<br/>
     * BooleanClause.Occur.MUST_NOT:必须不包含,类似于逻辑运算的非<br/>
     * BooleanClause.Occur.SHOULD:可以包含,类似于逻辑运算的或<br/>
     * 这三者组合,妙用无穷。<br/>
     * @throws Exception
     */
    @Test
    public void booleanQuery() throws Exception {
        IndexReader reader = IndexReader.open(FSDirectory.open(new File(XMLPropertyConfig.getConfigXML().getString("index_path"))), true);
        IndexSearcher searcher = new IndexSearcher(reader);
        
        //组合条件:
        //年龄(或):10、20、30、40
        //名字(与): 四
        //城市(非): 莆田
        TermQuery ageQuery10=new TermQuery(new Term("ages", "10"));
        TermQuery ageQuery20=new TermQuery(new Term("ages", "20"));
        TermQuery ageQuery30=new TermQuery(new Term("ages", "30"));
        TermQuery ageQuery40=new TermQuery(new Term("ages", "40"));
        
        TermQuery nameQuery=new TermQuery(new Term("name", "四"));
        
        TermQuery cityQuery=new TermQuery(new Term("city", "莆田"));
        
        BooleanQuery booleanQuery=new BooleanQuery();
        booleanQuery.add(ageQuery10, BooleanClause.Occur.SHOULD);
        booleanQuery.add(ageQuery20, BooleanClause.Occur.SHOULD);
        booleanQuery.add(ageQuery30, BooleanClause.Occur.SHOULD);
        booleanQuery.add(ageQuery40, BooleanClause.Occur.SHOULD);
        booleanQuery.add(nameQuery, BooleanClause.Occur.MUST);
        booleanQuery.add(cityQuery, BooleanClause.Occur.MUST_NOT); 
        
        TopDocs topDocs=searcher.search(booleanQuery, 1000);
        System.out.println("共检索出 " + topDocs.totalHits + " 条记录");
        System.out.println();
        
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scDoc : scoreDocs) {
            Document document = searcher.doc(scDoc.doc);
            String id = document.get("id");
            String name = document.get("name");
            String age = document.get("age");
            String city = document.get("city");
            String birthday = document.get("birthday");
            float score = scDoc.score; //相似度
            
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s, 相关度:%s.", 
                    id, name, age, city, DateUtils.longToString(Long.parseLong(birthday), Consts.FORMAT_SHORT), score));
        }
        
        searcher.close();
        reader.close();
    }
    
    /**
     * 范围搜索(允许搜索指定范围内的关键字结果)<br/><br/>
     * 
     * 主要对象是TermRangeQuery,调用方式如下:<br/>
     * TermRangeQuery rangequery=new TermRangeQuery(字段名, 起始值, 终止值, 起始值是否包含边界, 终止值是否包含边界); <br/><br/>
     * 
     * Hits hits=searcher.search(rangequery);<br/>
     * 此方法中的参数是Boolean类型的,表示是否包含边界 。<br/>
     * true 包含边界<br/>
     * false不包含边界<br/>
     * @throws Exception
     */
    @Test
    public void rangeQuery() throws Exception {
        IndexReader reader = IndexReader.open(FSDirectory.open(new File(XMLPropertyConfig.getConfigXML().getString("index_path"))), true);
        IndexSearcher searcher = new IndexSearcher(reader);
        
        TermRangeQuery idQuery=new TermRangeQuery("ids", "1", "3", true, true);  
        TermRangeQuery ageQuery=new TermRangeQuery("ages", "10", "30", true, true);  
        TermRangeQuery timeQuery=new TermRangeQuery("birthdays", "2011-03-09", "2013-01-07", true, true);
        
        TopDocs topDocs=searcher.search(timeQuery, 1000);
        System.out.println("共检索出 " + topDocs.totalHits + " 条记录");
        System.out.println();
        
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scDoc : scoreDocs) {
            Document document = searcher.doc(scDoc.doc);
            String id = document.get("id");
            String name = document.get("name");
            String age = document.get("age");
            String city = document.get("city");
            String birthday = document.get("birthday");
            float score = scDoc.score; //相似度
            
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s, 相关度:%s.", 
                    id, name, age, city, DateUtils.longToString(Long.parseLong(birthday), Consts.FORMAT_SHORT), score));
        }
        
        searcher.close();
        reader.close();
    }
    
    /**
     * 前缀搜索(搜索起始位置符合要求的结果)<br/><br/>
     * 
     * 主要对象是PrefixQuery,调用方式如下:<br/>
     * Term term=new Term(字段名, 搜索关键字);<br/>
     * PrefixQuery prefixquery=new PrefixQuery(term);<br/>
     * Hits hits=searcher.search(prefixquery);<br/>
     * 
     * @throws Exception
     */
    @Test
    public void prefixQuery() throws Exception {
        IndexReader reader = IndexReader.open(FSDirectory.open(new File(XMLPropertyConfig.getConfigXML().getString("index_path"))), true);
        IndexSearcher searcher = new IndexSearcher(reader);
        
        Term term=new Term("name", "王"); 
        PrefixQuery prefixquery=new PrefixQuery(term);
        
        TopDocs topDocs=searcher.search(prefixquery, 1000);
        System.out.println("共检索出 " + topDocs.totalHits + " 条记录");
        System.out.println();
        
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scDoc : scoreDocs) {
            Document document = searcher.doc(scDoc.doc);
            String id = document.get("id");
            String name = document.get("name");
            String age = document.get("age");
            String city = document.get("city");
            String birthday = document.get("birthday");
            float score = scDoc.score; //相似度
            
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s, 相关度:%s.", 
                    id, name, age, city, DateUtils.longToString(Long.parseLong(birthday), Consts.FORMAT_SHORT), score));
        }
        
        searcher.close();
        reader.close();
    }
    
    /**
     * 短语搜索(根据零碎的短语组合成新的词组进行搜索)<br/><br/>
     * 
     * 主要对象是PhraseQuery,调用方式如下:<br/>
     * Term term1=new Term(字段名, 搜索关键字);<br/>
     * Term term2=new Term(字段名, 搜索关键字);<br/><br/>
     * 
     * PhraseQuery phrasequery=new PhraseQuery();<br/>
     * phrasequery.setSlop(参数);<br/>
     * phrasequery.add(term1);<br/>
     * phrasequery.add(term2);<br/>
     * Hits hits=searcher.search(phrasequery);<br/>
     * 其中setSlop的参数是设置两个关键字之间允许间隔的最大值。<br/>
     * @throws Exception
     */
    @Test
    public void phraseQuery() throws Exception {
        IndexReader reader = IndexReader.open(FSDirectory.open(new File(XMLPropertyConfig.getConfigXML().getString("index_path"))), true);
        IndexSearcher searcher = new IndexSearcher(reader);
        
        Term term1=new Term("name", "林"); 
        Term term2=new Term("name", "钦"); 
        
        PhraseQuery phrasequery=new PhraseQuery(); 
        phrasequery.setSlop(100); 
        phrasequery.add(term1); 
        phrasequery.add(term2); 
        
        TopDocs topDocs=searcher.search(phrasequery, 1000);
        System.out.println("共检索出 " + topDocs.totalHits + " 条记录");
        System.out.println();
        
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scDoc : scoreDocs) {
            Document document = searcher.doc(scDoc.doc);
            String id = document.get("id");
            String name = document.get("name");
            String age = document.get("age");
            String city = document.get("city");
            String birthday = document.get("birthday");
            float score = scDoc.score; //相似度
            
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s, 相关度:%s.", 
                    id, name, age, city, DateUtils.longToString(Long.parseLong(birthday), Consts.FORMAT_SHORT), score));
        }
        
        searcher.close();
        reader.close();
    }
    
    /**
     * 多短语搜索(先指定一个前缀关键字,然后其他的关键字加在此关键字之后,组成词语进行搜索)<br/><br/>
     * 
     * 主要对象是MultiPhraseQuery,调用方式如下:<br/>
     * 
     * Term term=new Term(字段名,前置关键字);<br/>
     * Term term1=new Term(字段名,搜索关键字);<br/>
     * Term term2=new Term(字段名,搜索关键字);<br/><br/>
     * 
     * MultiPhraseQuery multiPhraseQuery=new MultiPhraseQuery();<br/><br/>
     * 
     * multiPhraseQuery.add(term);<br/>
     * multiPhraseQuery.add(new Term[]{term1, term2});<br/><br/>
     * 
     * Hits hits=searcher.search(multiPhraseQuery);<br/>
     * @throws Exception
     */
    @Test
    public void multiPhraseQuery() throws Exception {
        IndexReader reader = IndexReader.open(FSDirectory.open(new File(XMLPropertyConfig.getConfigXML().getString("index_path"))), true);
        IndexSearcher searcher = new IndexSearcher(reader);
        
        //查询“计张”、“计钦”组合的关键词,先指定一个前缀关键字,然后其他的关键字加在此关键字之后,组成词语进行搜索
        Term term=new Term("name", "计"); //前置关键字
        Term term1=new Term("name", "张"); //搜索关键字
        Term term2=new Term("name", "钦"); //搜索关键字
        
        MultiPhraseQuery multiPhraseQuery=new MultiPhraseQuery();
        multiPhraseQuery.add(term);
        multiPhraseQuery.add(new Term[]{term1, term2});
        
        
        TopDocs topDocs=searcher.search(multiPhraseQuery, 1000);
        System.out.println("共检索出 " + topDocs.totalHits + " 条记录");
        System.out.println();
        
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scDoc : scoreDocs) {
            Document document = searcher.doc(scDoc.doc);
            String id = document.get("id");
            String name = document.get("name");
            String age = document.get("age");
            String city = document.get("city");
            String birthday = document.get("birthday");
            float score = scDoc.score; //相似度
            
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s, 相关度:%s.", 
                    id, name, age, city, DateUtils.longToString(Long.parseLong(birthday), Consts.FORMAT_SHORT), score));
        }
        
        searcher.close();
        reader.close();
    }
    
    /**
     * 模糊搜索(顾名思义)<br/><br/>
     *
     * 主要对象是FuzzyQuery,调用方式如下:<br/><br/>
     *
     * Term term=new Term(字段名, 搜索关键字);<br/>
     * FuzzyQuery fuzzyquery=new FuzzyQuery(term,参数);<br/>
     * Hits hits=searcher.search(fuzzyquery);<br/>
     * 此中的参数是表示模糊度,是小于1的浮点小数,比如0.5f
     * @throws Exception
     */
    @Test
    public void fuzzyQuery() throws Exception {
        IndexReader reader = IndexReader.open(FSDirectory.open(new File(XMLPropertyConfig.getConfigXML().getString("index_path"))), true);
        IndexSearcher searcher = new IndexSearcher(reader);
        
        Term term=new Term("name", "三张");
        FuzzyQuery fuzzyquery=new FuzzyQuery(term, 0.5f); 
        
        TopDocs topDocs=searcher.search(fuzzyquery, 1000);
        System.out.println("共检索出 " + topDocs.totalHits + " 条记录");
        System.out.println();
        
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scDoc : scoreDocs) {
            Document document = searcher.doc(scDoc.doc);
            String id = document.get("id");
            String name = document.get("name");
            String age = document.get("age");
            String city = document.get("city");
            String birthday = document.get("birthday");
            float score = scDoc.score; //相似度
            
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s, 相关度:%s.", 
                    id, name, age, city, DateUtils.longToString(Long.parseLong(birthday), Consts.FORMAT_SHORT), score));
        }
        
        searcher.close();
        reader.close();
    }

    /**
     * 通配符搜索(顾名思义)<br/><br/>
     * 
     * 主要对象是:WildcardQuery,调用方式如下:<br/><br/>
     * 
     * Term term=new Term(字段名,搜索关键字+通配符);<br/>
     * WildcardQuery wildcardquery=new WildcardQuery(term);<br/>
     * Hits hits=searcher.search(wildcardquery);<br/><br/>
     * 
     * 其中的通配符分两种,即*和?<br/>
     * * 表示任意多的自负<br/>
     * ?表示任意一个字符
     * @throws Exception
     */
    @Test
    public void wildcardQuery() throws Exception {
        IndexReader reader = IndexReader.open(FSDirectory.open(new File(XMLPropertyConfig.getConfigXML().getString("index_path"))), true);
        IndexSearcher searcher = new IndexSearcher(reader);
        
        Term term=new Term("name", "三?");
        WildcardQuery wildcardQuery=new WildcardQuery(term);

        TopDocs topDocs=searcher.search(wildcardQuery, 1000);
        System.out.println("共检索出 " + topDocs.totalHits + " 条记录");
        System.out.println();
        
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scDoc : scoreDocs) {
            Document document = searcher.doc(scDoc.doc);
            String id = document.get("id");
            String name = document.get("name");
            String age = document.get("age");
            String city = document.get("city");
            String birthday = document.get("birthday");
            float score = scDoc.score; //相似度
            
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s, 相关度:%s.", 
                    id, name, age, city, DateUtils.longToString(Long.parseLong(birthday), Consts.FORMAT_SHORT), score));
        }
        
        searcher.close();
        reader.close();
    }
    
    /**
     * 正则表达式搜索(顾名思义,这个类引入lucene-queries-3.5.0.jar包)<br/><br/>
     * 
     * 主要对象是:RegexQuery,调用方式如下 <br/>
     * String regex = ".*"; <br/>
     * Term term = new Term (search_field_name, regex); <br/>
     * RegexQuery query = new RegexQuery (term); <br/>
     * TopDocs hits = searcher.search (query, 100); <br/>
     * @throws Exception
     */
    @Test
    public void regexQuery() throws Exception {
        IndexReader reader = IndexReader.open(FSDirectory.open(new File(XMLPropertyConfig.getConfigXML().getString("index_path"))), true);
        IndexSearcher searcher = new IndexSearcher(reader);
         
        String regex = "林*"; 
        Term term=new Term("name", regex);
        RegexQuery query = new RegexQuery(term);
        
        TopDocs topDocs=searcher.search(query, 1000);
        System.out.println("共检索出 " + topDocs.totalHits + " 条记录");
        System.out.println();
        
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scDoc : scoreDocs) {
            Document document = searcher.doc(scDoc.doc);
            String id = document.get("id");
            String name = document.get("name");
            String age = document.get("age");
            String city = document.get("city");
            String birthday = document.get("birthday");
            float score = scDoc.score; //相似度
            
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s, 相关度:%s.", 
                    id, name, age, city, DateUtils.longToString(Long.parseLong(birthday), Consts.FORMAT_SHORT), score));
        }
        
        searcher.close();
        reader.close();
    }

    /**
     * 数值范围过滤器,如:int、long、float类型等
     * 
     * @throws Exception
     */
    @Test
    public void numericFilter() throws Exception{ //CustomScoreQuery
        //Filter filter = NumericRangeFilter.newLongRange("id", 1l, 3l, true, true);
        Filter filter = NumericRangeFilter.newIntRange("age", 1, 39, true, true);
        List<Person> persons=search(filter, new String[]{"name","city"}, "厦门");
        for(Person person : persons){
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s.", 
                    person.getId(), person.getName(), person.getAge(), person.getCity(), DateUtils.dateToString(person.getBirthday(), Consts.FORMAT_SHORT)));
        }
    }
    
    /**
     * 时间范围过滤器
     * @throws Exception 
     */
    @Test
    public void dateFilter() throws Exception{
        //2008-06-12
        long min=DateUtils.stringToDate("2008-06-12", Consts.FORMAT_SHORT).getTime();
        //2013-01-07
        long max=DateUtils.stringToDate("2013-01-07", Consts.FORMAT_SHORT).getTime();
        Filter filter = NumericRangeFilter.newLongRange("birthday", min, max, true, true);
        List<Person> persons=search(filter, new String[]{"name","city"}, "厦门");
        for(Person person : persons){
            System.out.println(String.format("id:%s, name:%s, age:%s, city:%s, birthday:%s.", 
                    person.getId(), person.getName(), person.getAge(), person.getCity(), DateUtils.dateToString(person.getBirthday(), Consts.FORMAT_SHORT)));
        }
    }
    
    /**
     * 创建索引
     * 
     * @throws Exception
     */
    @Test
    public void createIndex() throws Exception {
        List<Document> docs = new ArrayList<Document>();
        for (Person person : getPersons()) {
            Document doc = new Document();
            //声明为NumericField的字段,只能用NumericRangeFilter对象范围查询,不能用作关键字查询。
            //NumericField不推荐,统一用Field
            doc.add(new NumericField("id", Field.Store.YES, true).setLongValue(person.getId()));
            doc.add(new NumericField("age", Field.Store.YES, true).setIntValue(person.getAge()));
            doc.add(new NumericField("birthday", Field.Store.YES, true).setLongValue(person.getBirthday().getTime()));
            
            doc.add(new Field("ids", person.getId()+"", Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.add(new Field("ages", person.getAge()+"", Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.add(new Field("birthdays", DateUtils.dateToString(person.getBirthday(), Consts.FORMAT_SHORT), 
                    Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.add(new Field("name", person.getName(), Field.Store.YES, Field.Index.ANALYZED));
            doc.add(new Field("city", person.getCity(), Field.Store.YES, Field.Index.ANALYZED));
            
            docs.add(doc);
        } 
        LuceneUtil.createIndex(docs);
    }
    
    private List<Person> search(Filter filter, String[] fields, String keyword) {
        List<Person> result = new ArrayList<Person>();
        
        IndexSearcher indexSearcher = null;
        TopDocs topDocs = null;
        try {
            // 创建索引搜索器,且只读
            IndexReader indexReader = IndexReader.open(FSDirectory.open(new File(XMLPropertyConfig.getConfigXML().getString("index_path"))), true);
            indexSearcher = new IndexSearcher(indexReader);

            MultiFieldQueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_35,
                    fields, new IKAnalyzer());
            Query query = queryParser.parse(keyword);

            // 返回前number条记录
            if(filter == null){
                topDocs=indexSearcher.search(query, 100000);
            }else {
                topDocs=indexSearcher.search(query, filter, 100000);
            }
            
            // 信息展示
            int totalCount = topDocs.totalHits;
            System.out.println("共检索出 " + totalCount + " 条记录");

            //高亮显示
            Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
            QueryScorer fragmentScorer = new QueryScorer(query);
            Highlighter highlighter = new Highlighter(formatter, fragmentScorer);
            Fragmenter fragmenter = new SimpleFragmenter(100);
            highlighter.setTextFragmenter(fragmenter);

            ScoreDoc[] scoreDocs = topDocs.scoreDocs;

            for (ScoreDoc scDoc : scoreDocs) {
                Document document = indexSearcher.doc(scDoc.doc);
                String id = document.get("id");
                String name = document.get("name");
                String age = document.get("age");
                String city = document.get("city");
                String birthday = document.get("birthday");
                float score = scDoc.score; //相似度
                System.out.println("相似度:"+score);

                String lighterName = highlighter.getBestFragment(new IKAnalyzer(), "name", name);
                if (null == lighterName) {
                    lighterName = name;
                }

                String lighterAge = highlighter.getBestFragment(new IKAnalyzer(), "age", age);
                if (null == lighterAge) {
                    lighterAge = age;
                }
                
                String lighterCity= highlighter.getBestFragment(new IKAnalyzer(), "city", city);
                if (null == lighterCity) {
                    lighterCity = city;
                }
                
                String lighterBirthday = highlighter.getBestFragment(new IKAnalyzer(), "birthday", birthday);
                if (null == lighterBirthday) {
                    lighterBirthday = birthday;
                }

                Person person = new Person();
                person.setId(Long.parseLong(id));
                person.setName(lighterName);
                person.setAge(NumberUtils.toInt(age));
                person.setCity(lighterCity);
                person.setBirthday(DateUtils.longToDate(Long.parseLong(lighterBirthday)));
                result.add(person);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                indexSearcher.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return result;
    }
    
    private List<Person> getPersons() {
        try {
            List<Person> persons = new ArrayList<Person>();
            persons.add(new Person(1l, "张三", 10, "福州", DateUtils.stringToDate("2013-01-07", Consts.FORMAT_SHORT)));
            persons.add(new Person(2l, "张四", 20, "莆田", DateUtils.stringToDate("2012-01-08", Consts.FORMAT_SHORT)));
            persons.add(new Person(3l, "王五", 30, "泉州", DateUtils.stringToDate("2011-03-09", Consts.FORMAT_SHORT)));
            persons.add(new Person(4l, "李四", 40, "厦门", DateUtils.stringToDate("2010-04-10", Consts.FORMAT_SHORT)));
            persons.add(new Person(5l, "李白", 50, "漳州", DateUtils.stringToDate("2009-05-11", Consts.FORMAT_SHORT)));
            persons.add(new Person(6l, "林计张三张三张三张三张三张三张三张三张三张三张三张三张三计钦", 60, "龙岩", DateUtils.stringToDate("2008-06-12", Consts.FORMAT_SHORT)));
            return persons;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}
复制代码

2、LuceneUtil类:Lucene增删改工具类

复制代码
package com.ljq.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;


/**
 * lucene工具类,采用IKAnalyzer中文分词器
 * 
 * @author 林计钦
 * @version 1.0 2013-6-3 下午03:51:29
 */
public class LuceneUtil {
    /** 索引库路径 */
    private static final String indexPath = XMLPropertyConfig.getConfigXML()
            .getString("index_path");
    public static IndexWriter indexWriter = null;
    private static final Logger log=Logger.getLogger(LuceneUtil.class);
    
    public static IndexWriter getIndexWriter(){
        if(indexWriter == null){
            try {
                //索引库路径不存在则新建一个
                File indexFile=new File(indexPath);
                if(!indexFile.exists()) indexFile.mkdir();
                
                Directory fsDirectory = FSDirectory.open(indexFile);
                IndexWriterConfig confIndex = new IndexWriterConfig(Version.LUCENE_35, new IKAnalyzer());
                confIndex.setOpenMode(OpenMode.CREATE_OR_APPEND);
                if (IndexWriter.isLocked(fsDirectory)) {
                    IndexWriter.unlock(fsDirectory);
                }
                indexWriter =new IndexWriter(fsDirectory, confIndex);
            } catch (Exception e) {
                e.printStackTrace();
            }  
        }
        return indexWriter;
    }
    
    /**
     * 创建索引
     * 
     * @param doc
     * @throws Exception
     */
    public static boolean createIndex(Document doc) {
        List<Document> docs = new ArrayList<Document>();
        docs.add(doc);
        return createIndex(docs);
    }
    
    /**
     * 创建索引
     * 
     * @param docs
     * @throws Exception
     */
    public static boolean createIndex(List<Document> docs) {
        try {
            for (Document doc : docs) {
                getIndexWriter().addDocument(doc);
            }
            // 优化操作
            getIndexWriter().commit();
            getIndexWriter().forceMerge(1); // forceMerge代替optimize
            log.info("lucene create success.");
            return true;
        } catch (Exception e) {
            log.error("lucene create failure.", e);
            return false;
        } finally {
            if (getIndexWriter() != null) {
                try {
                    getIndexWriter().close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    /**
     * 更新索引
     * 
     * 例如:Term term = new Term("id","1234567");
     * 先去索引文件里查找id为1234567的Document,如果有就更新它(如果有多条,最后更新后只有一条),如果没有就新增。
     * 数据库更新的时候,我们可以只针对某个列来更新,而lucene只能针对一行数据更新。
     * 
     * @param field Document的Field(类似数据库的字段)
     * @param value Field中的一个关键词
     * @param doc
     * @return
     */
    public static boolean updateIndex(String field, String value, Document doc) {
        try {
            getIndexWriter().updateDocument(new Term(field, value), doc);

            log.info("lucene update success.");
            return true;
        } catch (Exception e) {
            log.error("lucene update failure.", e);
            return false;
        }finally{
            if(getIndexWriter()!=null){
                try {
                    getIndexWriter().close();
                } catch (Exception e) {
                    e.printStackTrace();
                }  
            }
        }
    }
    
    /**
     * 删除索引
     * 
     * @param field Document的Field(类似数据库的字段)
     * @param value Field中的一个关键词
     * @param doc
     * @return
     */
    public static boolean deleteIndex(String field, String value) {
        try {
            getIndexWriter().deleteDocuments(new Term(field, value));
            
            log.info("lucene delete success.");
            return true;
        } catch (Exception e) {
            log.error("lucene delete failure.", e);
            return false;
        }finally{
            if(getIndexWriter()!=null){
                try {
                    getIndexWriter().close();
                } catch (Exception e) {
                    e.printStackTrace();
                }  
            }
        }
    }
    
    /**
     * 删除整个索引库
     * 
     * @return
     */
    public static boolean deleteAllIndex() {
        try {
            getIndexWriter().deleteAll();
            log.info("lucene delete all success.");
            return true;
        } catch (Exception e) {
            log.error("lucene delete all failure.", e);
            return false;
        }finally{
            if(getIndexWriter()!=null){
                try {
                    getIndexWriter().close();
                } catch (Exception e) {
                    e.printStackTrace();
                }  
            }
        }
    }
    

    /**
     * 判断索引库是否已创建
     * 
     * @return true:存在,false:不存在
     * @throws Exception
     */
    public static boolean existsIndex() throws Exception {
        File file = new File(indexPath);
        if (!file.exists()) {
            file.mkdirs();
        }
        String indexSufix = "/segments.gen";
        // 根据索引文件segments.gen是否存在判断是否是第一次创建索引
        File indexFile = new File(indexPath + indexSufix);
        return indexFile.exists();
    }
     
}
Elasticsearch全⽂检索 3.1查看文档(表数据)GET索引名(数据库名)表名/数据Id。 阅读详情

相关推荐

Lucence查询的实现

使用lucene实现的查询方法,里面有一个自己写的查询的实现,也有一些可能用不到方法,删除就可以了

Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(1)

一、Lucene的查询语法 Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html (1) 语法关键字 + - && || ! ( ) { } [ ] ^ " ~ * ? : \ 如果所要查询的查询词中本身包含关键字,则需要用\进行转义 (2) 查询词(Term) L...

diebiaosang4496的博客 359

Lucene 搜索方法(短语搜索)

NULL 博文链接:https://baobeituping.iteye.com/blog/847043

Lucene全文检索

Lucene全文检索

weixin_63719049的博客 1162

Lucene全文搜索 分组,精确查找,模糊查找

NULL 博文链接:https://zm603380946.iteye.com/blog/1827318

CST-Python(Pycharm如何与CST联合仿真,获取S参数)

我们想使用Python与CST联合仿真,其实是不需要自己下载Python的,因为CST在下载的时候就自带了Python3.6,我们只需要找到并将软件的环境设置到相应位置,即可联合仿真。(我的保存路径为D:\Program Files (x86)\CST Studio Suite 2020,在寻找时可以将前面切换成自己的保存路径,后面不需要修改)在CST帮助文档(打开CST软件,按F11即可直接访问帮助文档)里面,进行如下操作,便可以看到CST适配的Python版本为Python3.6!

weixin_52696285的博客 5649

Lucene 搜索方式

Lucene有多种搜索方式,可以根据需要选择不同的方式。 1、词条搜索(单个关键字查找)      主要对象是TermQuery      调用方式如下:Term term=new Term(字段名,搜索关键字);Query query=new TermQuery(term);Hits hits=searcher.search(query);   2、组合搜索(允许多个关键字组合搜索)...

zfsn7722483的专栏 191

基于h5端的视频录制和回溯功能的实现

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

发果叁 3191

Lucene全文检索之多种查询方式

查找索引 步骤 创建一个Director对象,指定索引库的位置 创建一个IndexReader对象 创建一个IndexSearcher对象,构造方法中的参数indexReader对象。 创建一个Query对象,如TermQuery 执行查询,得到一个TopDocs对象 取查询结果的总记录数 取文档列表 打印文档中的内容 关闭IndexReader对象 public void searchInd...

菜鸡也有大佬梦 886

Playwright自动化测试实战:攻克日历时间控件三大策略与Java实现

在Web自动化测试领域,元素定位与交互模拟是核心技术基础,其原理在于通过程序精确识别并操作页面中的DOM元素,以模拟真实用户行为。这项技术的核心价值在于提升测试效率、确保交互逻辑的覆盖度与可靠性,广泛应用于电商、金融、OA等系统的功能验证。日历时间控件作为典型的复杂交互组件,常涉及动态弹出层、多级导航与状态同步,是自动化测试中的常见难点。本文聚焦于使用Playwright工具,针对此类控件深入剖析了三种核心解决策略:从最高效的直接赋值、到全面模拟用户交互的主流方法,再到利用组件特性的混合定位方案,并结合Ja

weixin_28835551的博客 311

格拉姆角场(GAF)实战:用Python实现时间序列图像化处理

本文深入解析了格拉姆角场(GAF)技术,这是一种将一维时间序列转化为二维图像特征的方法,以便利用卷积神经网络(CNN)等图像模型进行深度分析。文章通过Python实战代码,详细演示了GASF和GADF两种核心转换的实现过程,并探讨了其在时序数据分类任务中的应用,为故障预警、金融模式识别等场景提供了强大的图像驱动分析视角。

weixin_29079671的博客 273

Lucene mysql app查询_lucene 各种查询方式

各种查询方式一:使用QueryParser与查询语法。(会使用分词器)MultiFieldQueryParser查询字符串 ------------------------> Query对象例如:上海 AND 天气上海 OR 天气上海新闻 AND site:news.163.com...方式二:直接创建Query的实例(子类的),不会使用分词器new TermQuery(..);new Bo...

weixin_40008870的博客 195

python实现序列比对之Needleman-wunsch算法 (附完整源码)

python实现序列比对之Needleman-wunsch算法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 461

Lucene 的查询方式|排序

Lucene 查询中有两种查询方式:使用字符串查询[可以使用特定的查询语法]    使用对像查询[查询对象,通过它的子类来实现] Query 查询:TermQuery 关键字查询  RangeQuery 范围查询  WildcardQuery 短语查询   BooleanQuery 布尔查询 private String indexPath="D://ec_pj//LuceneDe

lilp_ndsc的专栏 3561

[Python图像处理] 一.图像处理基础知识及OpenCV入门函数

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 同时推荐作者的C++图像系列知识: [数字图像处理] 一.MFC详解显示BMP格式图片 [数字图像处理] 二.MFC单文档分割窗...

杨秀璋的专栏 7万+

在 ABAP CDS View 里把 Conversion Functions 用到极致:FLTP 精度、单位换算、货币换算与小数位处理的工程化实践

数据格式转换在真实项目中比业务逻辑更容易引发问题。ABAP CDS中的转换函数(如FLTP_TO_DEC、UNIT_CONVERSION、CURRENCY_CONVERSION和DECIMAL_SHIFT)可帮助在数据库层统一数据口径,避免应用层重复处理。这些函数支持数值精度治理、单位换算、货币转换和小数位调整,能显著提升报表性能并减少逻辑分散。通过将格式转换前移到数据模型层,可以确保服务层和UI层的数据一致性,同时降低接口传输错误风险。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2350

kibana中使用的lucene查询语法

Lucene是目前最为流行的开源全文搜索引擎工具包,提供了完整的查询引擎和索引引擎,部分文本分析引擎。我们平时使用kibana、阿里云的日志查询或者其他一些lucene二次开发的产品,几乎都支持lucene语法。下面给大家演示各种查询方式,更多请参考 Apache Lucene - Query Parser Syntax 一、单词查询 直接使用单词,例如chenqionghe 多个单词,可以用逗号或者空格隔开,例如chenqionghe,活动 可以指定字段:空格来查询,例如page: 18、con.

Valiant 的博客 1901

Android 15.0 Launcher3中去掉Hotseat功能实现

在15.0系统产品定制化开发中,在Launcher3的定制化需求也是特别多的,由产品是小屏幕的产品,所以产品需求Launcher3 页面布局的原因,要求Launcher3 需要去掉Hotseat 不显示Hotseat下面几个图标,而做满屏app的显示,从而达到美观的效果,下面就来分析去掉Hotseat从而实现这个功能

安卓兼职framework和app工程师的博客 555

Lucene8.2 索引查询

Luence索引查询

qq_26786441的博客 625

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Lucene查询语法

TermQuery 是最常用的查询对象,也是 Lucene 可以使用的许多复杂查询的基础。它用于根据区分大小写的密钥检索文档 Query query = new TermQuery(new Term("title","java")); MatchAllDocsQuery匹配所有文档 //查询所有文档 Query query = new MatchAllDocsQuery(); // 相当于查询语法 : *:* TermRangeQuery是用于字符串范围查询的,既然涉及到范围必然需要字符串比.

qq_29188567的博客 2000

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

lucene学习五:各种查询条件

在前面4章基础上,本文介绍几种查询条件 public static void testQuery(Query query) throws Exception{             IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();             TopDocs topDocs=indexSearcher.sea

荒唐的程序猿 5752

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

lucene3.6.0的查询条件分析

// TermQuery:词条查询。通过对某个词条的指定,实现检索索引中存在该词条的所有文档。     Query query = new TermQuery(New Term("content","java")),区分大小写               // TermRangeQuery:范围查询。这种范围可以是日期,时间,数字,大小等等。可以使用"context:[a to b]"

程序员之路 2934

Lucene查询语法汇总 ELK

Lucene查询语法汇总 ELK

weixin_45623983的博客 1578

Lucene学习笔记之(五)lucene的特殊查询

步骤一:创建maven现目 步骤二:配置pom.xml文件,代码如下: junit junit 3.8.1 test org.apache.lucene

孤师的博客 2107

Lucene查询操作

Lucene查询的两种方式 1.Query查询   1).MatchAllDocsQuery   2).TermQuery   3).NumberRangeQuery   4).BooleanQuery 2.QueryParser   1).QueryParser   2).MultiFieldQueryParser 先写一下获取IndexSearcher对象的set方法 1.IndexReade...

labviewxx的博客 281

lucene查询

Lucene查询 package com.lucene.query; import java.io.File; import java.io.IOException; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis

梁小明的博客 656
上一篇: SpringMVC 国际化问题
下一篇: lucene创建索引
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值