精华内容
下载资源
问答
  • 为什么代码调试显示游标无效 create or replace procedure ss( bn in book_lab.bookname%type) ... (select * from book_lab where bookname ... 的表是book_lab 有的属性有 bookid bookname writerid
  • 我首先一个表,这个表有如下字段user(id int 自增类型,depname varchar )最近在使用linq时,遇到一个问题,就是能不能可以写出下面效果的linq语句select * from user where depname like %蔡%工%献%在网上查了...

     

    我首先建一个表,这个表有如下字段

    user

    (id int 自增类型,

    depname varchar

    最近在使用linq时,遇到一个问题,就是能不能可以写出下面效果的linq语句

    select * from user where depname like '%蔡%工%献%'

    在网上查了一下资料,差不多都是这样的效果

    DAL.HISEntities model = new DAL.HISEntities();

    string p1="蔡献";

    var p=model.User.where(c=>c.depname.Contains(p1));

    大家如果认真一下就会发现,这条linq语句是不达到上面的sql语句效果的,

    我们该这么办呢?

    我们先不考虑别的东西,我们来写一个算法

    有一个字符串string n=”蔡常常丰富经济局“,判断string m=”常常局“在不在里面n

    里面,这个有很多方法,大家可以自己想想,这是我自己的算法

     

     public bool likeString(string containsstring, string mitem)
            {
                List<int> list = new List<int>();

                foreach (var item in containsstring)
                {
                    if (mitem.Contains(item))
                    {
                        list.Add(1);
                    }
                }

                if (list.Count(c => c == 1) != 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

     

    解决掉这个问题,下面的问题就比较容易解决

    我们是不是可以把user表全部查出来

    这个是关键,如果想通这点,那么,模糊查询就可以写出来

     

    这是我的,呵呵

    DAL.HISEntities model = new DAL.HISEntities();
            var p = model.User.Select(c=>c.Depname);///先把整张表查出来
     
           Common.Helper helper = new Common.Helper();
          ///我自己写的帮助类,里面有likeString方法

           List<string> list=new List<string>();

            foreach (var item in p)
            {
                if (helper.likeString(TextBox1.Text.Trim(),item))///自己看懂,关键点就在这里
                {
                    list.Add(item);
                }
            }

            var p2 = model.User.Join(list.AsEnumerable(), c => c.Depname, y => y, (m, n) => new { m.Id,
                m.Depname});


            GridView1.DataSource = p2;
            GridView1.DataBind();

     

    展开全文
  • Lucene的查询方式很 丰富,对于数值类型的数据,采取TermRangeQuery的方式,对于String类型的,就可以采取TermQuery等,查询方式了,可以通过采取合适的查询方式,检索到数据。Queryparser这个查询方式包含了其他几...

    Lucene的查询方式很 丰富,对于数值类型的数据,采取TermRangeQuery的方式,对于String类型的,就可以采取TermQuery等,查询方式了,可以通过采取合适的查询方式,检索到数据。Queryparser这个查询方式包含了其他几种查询方式。

    查询方式

    查询方式意义
    TermQuery精确查询
    TermRangeQuery查询一个范围
    PrefixQuery前缀匹配查询
    WildcardQuery通配符查询
    BooleanQuery多条件查询
    PhraseQuery短语查询
    FuzzyQuery模糊查询
    Queryparser万能查询(上面的都可以用这个来查询到)

    案例

    package com.yellowcong.demo;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.IntField;
    import org.apache.lucene.document.LongField;
    import org.apache.lucene.document.StringField;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.FuzzyQuery;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.NumericRangeQuery;
    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.TopDocs;
    import org.apache.lucene.search.WildcardQuery;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.util.Version;
    
    /**
     * 创建用户:狂飙的yellowcong<br/>
     * 创建时间:下午5:27:50<br/>
     * 创建日期:2017年12月2日<br/>
     * 机能概要:
     */
    public class Demo4 {
        private static List<Passage> psgList = null;
    
        // 写对象
        private static IndexWriter writer = null;
    
        public static void main(String[] args) throws Exception {
    
            // 删除 所有索引
            deleteAll();
    
            // 建立索引
            index();
    
            //精确String 类型查询
            getByTermQuery();
    
            //范围查询
            getByRange();
    
            //前缀匹配查询
            getByPrefix();
    
            //通配符查询
            getByWildcard();
    
            //短语查询
            getByPhrase();
    
            //模糊查询
            getByFuzzy();
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月3日<br/>
         * 创建时间:下午12:00:43<br/>
         * 机能概要:精确查询
         * @throws Exception
         */
        public static void getByTermQuery() {
            System.out.println("-------------查询用户名为yellowcong的数据-------------");
            //精确查询,根据名称来直接
            Query query = new TermQuery(new Term("username", "yellowcong"));
    
            //执行查询
            excQuery(query);
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月3日<br/>
         * 创建时间:下午12:25:21<br/>
         * 机能概要:范围查询
         */
        public static void getByRange(){
            //精确查询
            System.out.println("-------------查询id在1-3的数据-------------");
            //查询前三条数据,后面两个true,表示的是是否包含头和尾
            Query query = NumericRangeQuery.newIntRange("id", 1, 3, true, true);
            //执行查询
            excQuery(query);
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月3日<br/>
         * 创建时间:下午12:25:56<br/>
         * 机能概要:前缀查询数据
         */
        public static void getByPrefix(){
            System.out.println("-------------查询前缀 邮箱 以z开头的数据-------------");
            //查询前缀 邮箱 以z开头的数据
            Query query = new PrefixQuery(new Term("email", "z"));
    
            //执行查询
            excQuery(query);
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月3日<br/>
         * 创建时间:下午12:29:55<br/>
         * 机能概要:通配符查询数据
         */
        public static void getByWildcard(){
            //通配符就更简单了,只要知道“*”表示0到多个字符,而使用“?”表示一个字符就行了
            System.out.println("-------------------查询email 以 @qq结尾的数据--------------");
            //查询email 以 @qq结尾的数据
            Query query = new WildcardQuery(new Term("email","*@qq.com"));
            //执行查询
            excQuery(query);
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月3日<br/>
         * 创建时间:下午12:43:43<br/>
         * 机能概要:短语查询,查询中间有几个单词的那种
         */
        public static void getByPhrase(){
            System.out.println("------------查询内容中,有I LOVE YOU 的数据---------------");
            //短语查询,但是对于中文没有太多的用,其中查询的时候还有
            PhraseQuery query = new PhraseQuery();
            //设定有几跳,表示中间存在一个单词
            query.setSlop(1);
            //查询
            query.add(new Term("content","i"));
    
            //I  XX you  就可以被查询出来
            query.add(new Term("content","you"));
    
            excQuery(query);
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月3日<br/>
         * 创建时间:下午12:49:14<br/>
         * 机能概要:默认提供的模糊查询对中文来说,没有任何用
         * @throws Exception
         */
        public  static void getByFuzzy() throws Exception{
            System.out.println("-------------------------模糊查询---------------");
            FuzzyQuery query = new FuzzyQuery(new Term("username","zhangsan"));
            excQuery(query);
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月3日<br/>
         * 创建时间:下午12:01:55<br/>
         * 机能概要:查询Query 将需要查询的条件传递进来
         * @param query
         */
        public static void excQuery(Query query){
            //查询
            IndexReader reader  = null;
            try {
                reader = getIndexReader();
    
                //获取查询数据
                IndexSearcher searcher = new IndexSearcher(reader);
    
                //检索数据
                TopDocs topDocs = searcher.search(query, 100);
                for(ScoreDoc scoreDoc : topDocs.scoreDocs){
                    //湖区偶
                    Document doc = reader.document(scoreDoc.doc);
                    System.out.println(doc.get("id")+":"+doc.get("username")+":"+doc.get("email"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                coloseReader(reader);
            }
        }
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月3日<br/>
         * 创建时间:上午11:52:52<br/>
         * 机能概要:关闭IndexReader
         * @param reader
         */
        private static void coloseReader(IndexReader reader) {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        static {
            psgList = new ArrayList<Passage>();
    
            // 产生一堆数据
            psgList.add(new Passage(1, "yellowcong" ,
                    "717350389@qq.com", "逗比", 23 , "I LOVE YOU ", new Date()));
    
            psgList.add(new Passage(2, "张三" ,
                    "zhashang@qq.com", "逗比", 23, "三炮", new Date()));
            psgList.add(new Passage(3, "李四" ,
                    "lisi@neusoft.com", "逗比", 23, "三炮", new Date()));
            psgList.add(new Passage(4, "王五" ,
                    "wangwu@aliyun.com", "逗比", 23, "三炮", new Date()));
            psgList.add(new Passage(5, "赵六" ,
                    "zhaoliu@baidu.com", "逗比", 23, "三炮", new Date()));
            System.out.println("-------------------------添加的数据----------------------");
            for(Passage psg:psgList){
                System.out.println(psg.getId()+":"+psg.getUsername()+":"+psg.getEmail()+":"+psg.getContent());
            }
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午5:43:57<br/>
         * 机能概要:获取IndexWriter 同一时间 ,只能打开一个 IndexWriter,独占写锁 。内建线程安全机制。
         * 
         * @return
         * @throws Exception
         */
        @SuppressWarnings("static-access")
        public static IndexWriter getIndexWriter() throws Exception {
            // 创建IdnexWriter
            String path = getIndexPath();
            FSDirectory fs = FSDirectory.open(new File(path));
            // 判断资源是否占用
            if (writer == null || !writer.isLocked(fs)) {
                synchronized (Demo3.class) {
                    if (writer == null || !writer.isLocked(fs)) {
                        // 创建writer对象
                        writer = new IndexWriter(fs,
                                new IndexWriterConfig(Version.LUCENE_45, new StandardAnalyzer(Version.LUCENE_45)));
                    }
                }
            }
            return writer;
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午5:46:36<br/>
         * 机能概要:获取到IndexReader 任意多个IndexReaders可同时打开,可以跨JVM。
         * 
         * @return
         * @throws Exception
         */
        public static IndexReader getIndexReader() throws Exception {
            // 创建IdnexWriter
            String path = getIndexPath();
            FSDirectory fs = FSDirectory.open(new File(path));
            // 获取到读
            return IndexReader.open(fs);
        }
    
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午7:57:04<br/>
         * 机能概要:删除所有的索引
         */
        public static void deleteAll() {
            IndexWriter writer = null;
            try {
                // 获取IndexWriter
                writer = getIndexWriter();
    
                // 删除所有的数据
                writer.deleteAll();
    
                int cnt = writer.numDocs();
                System.out.println("索引条数\t" + cnt);
    
                // 提交事物
                writer.commit();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                coloseWriter(writer);
            }
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午5:37:22<br/>
         * 机能概要:获取索引目录
         * 
         * @return 目录
         */
        private static String getIndexPath() {
            // 获取索引的目录
            String path = Demo3.class.getClassLoader().getResource("index").getPath();
    
            // 不存在就创建目录
            File file = new File(path);
            if (!file.exists()) {
                file.mkdirs();
            }
            return path;
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午8:24:16<br/>
         * 机能概要:关闭IndexWriter
         */
        private static void coloseWriter(IndexWriter writer) {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午8:26:15<br/>
         * 机能概要:关闭IndexReader
         * 
         * @param reader
         */
        public static void closerReader(IndexReader reader) {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午8:10:01<br/>
         * 机能概要: 查询数据
         * 
         * @param key
         *            查询范围
         * @param val
         *            值
         */
        public static void search(String key, Object val) {
            IndexReader reader = null;
            try {
                reader = getIndexReader();
    
                IndexSearcher searcher = new IndexSearcher(reader);
    
                // 精确查询
                Query query = null;
    
                // 定义查询条件
                if (val instanceof Integer) {
                    // 后面的两个true 表示的是 是否包含 上下的数据
                    query = NumericRangeQuery.newIntRange(key, Integer.parseInt(val.toString()),
                            Integer.parseInt(val.toString()), true, true);
                } else {
                    query = new TermQuery(new Term(key, val.toString()));
                }
                // QueryParser paraser = new QueryParser(Version.LUCENE_45, key, new
                // StandardAnalyzer(Version.LUCENE_45));
                // Query query = paraser.parse(val);
    
                // 获取查询到的Docuemnt
                TopDocs topDocs = searcher.search(query, 500);
                // 总共命中的条数
                System.out.println(topDocs.totalHits);
                for (ScoreDoc score : topDocs.scoreDocs) {
                    //
                    Document doc = searcher.doc(score.doc);
    
                    // 查询到的结果
                    String username = doc.get("username");
                    System.out.println(username);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closerReader(reader);
            }
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午6:03:33<br/>
         * 机能概要:建立索引
         */
        public static void index() {
            IndexWriter writer = null;
            try {
                // 1、获取IndexWriter
                writer = getIndexWriter();
    
                // 2、建立索引
                for (Passage psg : psgList) {
                    Document doc = new Document();
    
                    // IntField 不能直接检索到,需要结合
                    doc.add(new IntField("id", psg.getId(), Field.Store.YES));
    
                    // 用户String类型的字段的存储,StringField是只索引不分词
                    doc.add(new TextField("username", psg.getUsername(), Field.Store.YES));
    
                    // 主要对int类型的字段进行存储,需要注意的是如果需要对InfField进行排序使用SortField.Type.INT来比较,如果进范围查询或过滤,需要采用NumericRangeQuery.newIntRange()
                    doc.add(new IntField("age", psg.getAge(), Field.Store.YES));
    
                    // 对String类型的字段进行存储,TextField和StringField的不同是TextField既索引又分词
                    doc.add(new TextField("content", psg.getContent(), Field.Store.NO));
    
                    doc.add(new StringField("keyword", psg.getKeyword(), Field.Store.YES));
    
                    doc.add(new StringField("email", psg.getEmail(), Field.Store.YES));
    
                    // 日期数据添加索引
                    doc.add(new LongField("addDate", psg.getAddDate().getTime(), Field.Store.YES));
    
                    // 3、添加文档
                    writer.addDocument(doc);
                }
    
                // 索引条数
                int cnt = writer.numDocs();
                System.out.println("索引条数\t" + cnt);
    
                // 提交事物
                writer.commit();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                coloseWriter(writer);
            }
        }
    
        static class Passage {
            private int id;
            private String username;
            private String email;
            private String keyword;
            private int age;
            // 这个模拟的是文章
            private String content;
            private Date addDate;
    
            public Passage(int id, String username, String email, String keyword, int age, String content, Date addDate) {
                super();
                this.id = id;
                this.username = username;
                this.email = email;
                this.keyword = keyword;
                this.age = age;
                this.content = content;
                this.addDate = addDate;
            }
    
            public int getId() {
                return id;
            }
    
            public void setId(int id) {
                this.id = id;
            }
    
            public String getUsername() {
                return username;
            }
    
            public void setUsername(String username) {
                this.username = username;
            }
    
            public String getEmail() {
                return email;
            }
    
            public void setEmail(String email) {
                this.email = email;
            }
    
            public String getKeyword() {
                return keyword;
            }
    
            public void setKeyword(String keyword) {
                this.keyword = keyword;
            }
    
            public int getAge() {
                return age;
            }
    
            public void setAge(int age) {
                this.age = age;
            }
    
            public String getContent() {
                return content;
            }
    
            public void setContent(String content) {
                this.content = content;
            }
    
            public Date getAddDate() {
                return addDate;
            }
    
            public void setAddDate(Date addDate) {
                this.addDate = addDate;
            }
        }
    }
    

    运行结果 
    这里写图片描述

    Queryparser

    通过Queryparaser直接就可以将上面的方法都包揽了

    常用匹配

    @Test
        public void searchByQueryPhase() throws ParseException{
            IndexUtils utls = new IndexUtils();
            //设定默认搜索域,将默认搜索域 设定在Content
            QueryParser parse = new QueryParser(Version.LUCENE_35, "content",new StandardAnalyzer(Version.LUCENE_35));
    //      parse.setDefaultOperator(Operator.AND);//将空格默认 定义为AND
            parse.setAllowLeadingWildcard(true);//设定第一个* 可以匹配
            Query query = parse.parse("yellow");
            //其中空格默认就是OR 
            query = parse.parse("yellow cong");
    
            //改变搜索域,搜索域 为 name
            query = parse.parse("name:yellow1");
    
            //使用通配符 , 设定查询类容为 以 y 开头的数据
            query = parse.parse("name:y*"); //其中* 不可以放在字符串的首位
    
            //将字符串放在首位,默认情况下回报错
            query = parse.parse("email:*@yellow.com"); //其中我们可以更改 第一个通配值得功能
    
            //其中 + - 表示有 和没有 其中需要有空格 ,而且第一个+ 或者 - 需要放在第一个位置
            query = parse.parse("- content: cong  + i "); //这个表示的是content 中不含有 cong ,但是含有i
    
            //匹配区间, 其中TO 必须是大写的,还有有空格
            query = parse.parse("id:[1 TO 4]"); //设定查询的Id为 1-4
    
             //开区间匹配
            query = parse.parse("id:(1 TO 4)");
            //匹配连起来的String
            query = parse.parse("\"I like yellow cong\""); //这个是查询的一个一个词  ,匹配String
    
            //匹配一个或者多个数据
            query = parse.parse("\"I cong\"~2"); //表示中间含有一个单词
    
            //模糊查询
            query = parse.parse("name:yellow~");
    
            //匹配数字,这个方法中没有字符类容,所以需要自定义了
    
            IndexReaderHelper.searchByQueryPhase(query, 10);
        }

    案例

    package com.yellowcong.demo;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.IntField;
    import org.apache.lucene.document.LongField;
    import org.apache.lucene.document.StringField;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.queryparser.classic.QueryParser;
    import org.apache.lucene.search.FuzzyQuery;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.NumericRangeQuery;
    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.TopDocs;
    import org.apache.lucene.search.WildcardQuery;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.util.Version;
    
    /**
     * 创建用户:狂飙的yellowcong<br/>
     * 创建时间:下午5:27:50<br/>
     * 创建日期:2017年12月2日<br/>
     * 机能概要:
     */
    public class Demo5 {
        private static List<Passage> psgList = null;
    
        // 写对象
        private static IndexWriter writer = null;
    
        public static void main(String[] args) throws Exception {
    
            // 删除 所有索引
            deleteAll();
    
            // 建立索引
            index();
    
            QueryParser parser = getQueryParser();
            //将空格默认 定义为AND
    //      parse.setDefaultOperator(Operator.AND);
            //设定第一个* 可以匹配
            parser.setAllowLeadingWildcard(true);
    
            //精确String 类型查询
            System.out.println("-------------查询用户名为yellowcong的数据-------------");
            //精确查询,根据名称来直接
            Query query = parser.parse("username:yellowcong");
            //执行查询
            excQuery(query);
    
    
            //范围查询
            System.out.println("-------------查询id在1-3的数据-------------");
            //查询前三条数据,后面两个true,表示的是是否包含头和尾
            //匹配区间, 其中TO 必须是大写的,还有有空格
            query = parser.parse("id:[1 TO 3]"); //设定查询的Id为 1-4
    
            //执行查询
            excQuery(query);
    
    
            //前缀匹配查询
            System.out.println("-------------查询前缀 邮箱 以z开头的数据-------------");
            //查询前缀 邮箱 以z开头的数据
            query = parser.parse("email:z*");
            excQuery(query);
    
            //通配符查询
            //通配符就更简单了,只要知道“*”表示0到多个字符,而使用“?”表示一个字符就行了
            System.out.println("-------------------查询email 以 @qq结尾的数据--------------");
            //查询email 以 @qq结尾的数据
            //需要设定 * 可以放在前面  QueryParser.setAllowLeadingWildcard(true);
            //将字符串放在首位,默认情况下回报错
            query = parser.parse("email:*@qq.com");
            excQuery(query);        
    
    
            //短语查询
            System.out.println("------------查询内容中,有I LOVE YOU 的数据---------------");
            //短语查询,但是对于中文没有太多的用,其中查询的时候还有
            query =parser.parse("\"i you\"~2"); //表示中间含有一个单词
            excQuery(query);
    
            //模糊查询
            System.out.println("-------------------------模糊查询---------------");
            query = parser.parse("username:zhangsan~");
            excQuery(query);
    
        }
    
        private static QueryParser getQueryParser(){
            QueryParser parser =new QueryParser(Version.LUCENE_45,"content", new StandardAnalyzer(Version.LUCENE_45));
            return parser;
        }
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月3日<br/>
         * 创建时间:下午12:01:55<br/>
         * 机能概要:查询Query 将需要查询的条件传递进来
         * @param query
         */
        public static void excQuery(Query query){
            //查询
            IndexReader reader  = null;
            try {
                reader = getIndexReader();
    
                //获取查询数据
                IndexSearcher searcher = new IndexSearcher(reader);
    
                //检索数据
                TopDocs topDocs = searcher.search(query, 100);
                for(ScoreDoc scoreDoc : topDocs.scoreDocs){
                    //湖区偶
                    Document doc = reader.document(scoreDoc.doc);
                    System.out.println(doc.get("id")+":"+doc.get("username")+":"+doc.get("email"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                coloseReader(reader);
            }
        }
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月3日<br/>
         * 创建时间:上午11:52:52<br/>
         * 机能概要:关闭IndexReader
         * @param reader
         */
        private static void coloseReader(IndexReader reader) {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        static {
            psgList = new ArrayList<Passage>();
    
            // 产生一堆数据
            psgList.add(new Passage(1, "yellowcong" ,
                    "717350389@qq.com", "逗比", 23 , "I LOVE YOU ", new Date()));
    
            psgList.add(new Passage(2, "张三" ,
                    "zhashang@qq.com", "逗比", 23, "三炮", new Date()));
            psgList.add(new Passage(3, "李四" ,
                    "lisi@neusoft.com", "逗比", 23, "三炮", new Date()));
            psgList.add(new Passage(4, "王五" ,
                    "wangwu@aliyun.com", "逗比", 23, "三炮", new Date()));
            psgList.add(new Passage(5, "赵六" ,
                    "zhaoliu@baidu.com", "逗比", 23, "三炮", new Date()));
            System.out.println("-------------------------添加的数据----------------------");
            for(Passage psg:psgList){
                System.out.println(psg.getId()+":"+psg.getUsername()+":"+psg.getEmail()+":"+psg.getContent());
            }
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午5:43:57<br/>
         * 机能概要:获取IndexWriter 同一时间 ,只能打开一个 IndexWriter,独占写锁 。内建线程安全机制。
         * 
         * @return
         * @throws Exception
         */
        @SuppressWarnings("static-access")
        public static IndexWriter getIndexWriter() throws Exception {
            // 创建IdnexWriter
            String path = getIndexPath();
            FSDirectory fs = FSDirectory.open(new File(path));
            // 判断资源是否占用
            if (writer == null || !writer.isLocked(fs)) {
                synchronized (Demo3.class) {
                    if (writer == null || !writer.isLocked(fs)) {
                        // 创建writer对象
                        writer = new IndexWriter(fs,
                                new IndexWriterConfig(Version.LUCENE_45, new StandardAnalyzer(Version.LUCENE_45)));
                    }
                }
            }
            return writer;
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午5:46:36<br/>
         * 机能概要:获取到IndexReader 任意多个IndexReaders可同时打开,可以跨JVM。
         * 
         * @return
         * @throws Exception
         */
        public static IndexReader getIndexReader() throws Exception {
            // 创建IdnexWriter
            String path = getIndexPath();
            FSDirectory fs = FSDirectory.open(new File(path));
            // 获取到读
            return IndexReader.open(fs);
        }
    
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午7:57:04<br/>
         * 机能概要:删除所有的索引
         */
        public static void deleteAll() {
            IndexWriter writer = null;
            try {
                // 获取IndexWriter
                writer = getIndexWriter();
    
                // 删除所有的数据
                writer.deleteAll();
    
                int cnt = writer.numDocs();
                System.out.println("索引条数\t" + cnt);
    
                // 提交事物
                writer.commit();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                coloseWriter(writer);
            }
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午5:37:22<br/>
         * 机能概要:获取索引目录
         * 
         * @return 目录
         */
        private static String getIndexPath() {
            // 获取索引的目录
            String path = Demo3.class.getClassLoader().getResource("index").getPath();
    
            // 不存在就创建目录
            File file = new File(path);
            if (!file.exists()) {
                file.mkdirs();
            }
            return path;
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午8:24:16<br/>
         * 机能概要:关闭IndexWriter
         */
        private static void coloseWriter(IndexWriter writer) {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午8:26:15<br/>
         * 机能概要:关闭IndexReader
         * 
         * @param reader
         */
        public static void closerReader(IndexReader reader) {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午8:10:01<br/>
         * 机能概要: 查询数据
         * 
         * @param key
         *            查询范围
         * @param val
         *            值
         */
        public static void search(String key, Object val) {
            IndexReader reader = null;
            try {
                reader = getIndexReader();
    
                IndexSearcher searcher = new IndexSearcher(reader);
    
                // 精确查询
                Query query = null;
    
                // 定义查询条件
                if (val instanceof Integer) {
                    // 后面的两个true 表示的是 是否包含 上下的数据
                    query = NumericRangeQuery.newIntRange(key, Integer.parseInt(val.toString()),
                            Integer.parseInt(val.toString()), true, true);
                } else {
                    query = new TermQuery(new Term(key, val.toString()));
                }
                // QueryParser paraser = new QueryParser(Version.LUCENE_45, key, new
                // StandardAnalyzer(Version.LUCENE_45));
                // Query query = paraser.parse(val);
    
                // 获取查询到的Docuemnt
                TopDocs topDocs = searcher.search(query, 500);
                // 总共命中的条数
                System.out.println(topDocs.totalHits);
                for (ScoreDoc score : topDocs.scoreDocs) {
                    //
                    Document doc = searcher.doc(score.doc);
    
                    // 查询到的结果
                    String username = doc.get("username");
                    System.out.println(username);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closerReader(reader);
            }
        }
    
        /**
         * 创建用户:狂飙的yellowcong<br/>
         * 创建日期:2017年12月2日<br/>
         * 创建时间:下午6:03:33<br/>
         * 机能概要:建立索引
         */
        public static void index() {
            IndexWriter writer = null;
            try {
                // 1、获取IndexWriter
                writer = getIndexWriter();
    
                // 2、建立索引
                for (Passage psg : psgList) {
                    Document doc = new Document();
    
                    // IntField 不能直接检索到,需要结合
                    doc.add(new IntField("id", psg.getId(), Field.Store.YES));
    
                    // 用户String类型的字段的存储,StringField是只索引不分词
                    doc.add(new TextField("username", psg.getUsername(), Field.Store.YES));
    
                    // 主要对int类型的字段进行存储,需要注意的是如果需要对InfField进行排序使用SortField.Type.INT来比较,如果进范围查询或过滤,需要采用NumericRangeQuery.newIntRange()
                    doc.add(new IntField("age", psg.getAge(), Field.Store.YES));
    
                    // 对String类型的字段进行存储,TextField和StringField的不同是TextField既索引又分词
                    doc.add(new TextField("content", psg.getContent(), Field.Store.NO));
    
                    doc.add(new StringField("keyword", psg.getKeyword(), Field.Store.YES));
    
                    doc.add(new StringField("email", psg.getEmail(), Field.Store.YES));
    
                    // 日期数据添加索引
                    doc.add(new LongField("addDate", psg.getAddDate().getTime(), Field.Store.YES));
    
                    // 3、添加文档
                    writer.addDocument(doc);
                }
    
                // 索引条数
                int cnt = writer.numDocs();
                System.out.println("索引条数\t" + cnt);
    
                // 提交事物
                writer.commit();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                coloseWriter(writer);
            }
        }
    
        static class Passage {
            private int id;
            private String username;
            private String email;
            private String keyword;
            private int age;
            // 这个模拟的是文章
            private String content;
            private Date addDate;
    
            public Passage(int id, String username, String email, String keyword, int age, String content, Date addDate) {
                super();
                this.id = id;
                this.username = username;
                this.email = email;
                this.keyword = keyword;
                this.age = age;
                this.content = content;
                this.addDate = addDate;
            }
    
            public int getId() {
                return id;
            }
    
            public void setId(int id) {
                this.id = id;
            }
    
            public String getUsername() {
                return username;
            }
    
            public void setUsername(String username) {
                this.username = username;
            }
    
            public String getEmail() {
                return email;
            }
    
            public void setEmail(String email) {
                this.email = email;
            }
    
            public String getKeyword() {
                return keyword;
            }
    
            public void setKeyword(String keyword) {
                this.keyword = keyword;
            }
    
            public int getAge() {
                return age;
            }
    
            public void setAge(int age) {
                this.age = age;
            }
    
            public String getContent() {
                return content;
            }
    
            public void setContent(String content) {
                this.content = content;
            }
    
            public Date getAddDate() {
                return addDate;
            }
    
            public void setAddDate(Date addDate) {
                this.addDate = addDate;
            }
        }
    }
    

    这里写图片描述

    展开全文
  • python 数据库模糊查询

    千次阅读 2018-08-06 22:36:26
    的模式匹配功能提供了多种工具来进行字符串比较。有了模式匹配功能就可以使用通配符、字符串列表或字符区间的任何组合来匹配字符串。下列表格指出 pattern 中允许的字符以及它们与什么进行匹配:
    import sqlite3
    import random
    connect = sqlite3.connect('nameDB')
    cursor = connect.cursor()
    cursor.execute('CREATE TABLE IF NOT EXISTS nameTable(name text)')
    connect.commit()
    
    str = """
    赵钱孙李,周吴郑王。
    冯陈褚卫,蒋沈韩杨。
    朱秦尤许,何吕施张。
    孔曹严华,金魏陶姜。
    戚谢邹喻,柏水窦章。
    云苏潘葛,奚范彭郎。
    鲁韦昌马,苗凤花方。
    俞任袁柳,酆鲍史唐。
    费廉岑薛,雷贺倪汤。
    """
    str = str.replace(',','').replace('。','').replace('\n','')
    print(str)

    扩展一下:
    pattern 中的字符 符合 string 中的 
    ? 任何单一字符。 
    * 零个或多个字符。 
    # 任何一个数字 (0–9)。 
    [charlist] charlist.中的任何单一字符。 
    [!charlist] 不在 charlist 中的任何单一字符。
    在中括号 ([ ]) 中,可以用由一个或多个字符 (charlist) 组成的组与 string 中的任一字符进行匹配,这个组几乎包括任何一个字符代码以及数字。
    注意 为了与左括号 ([)、问号 (?)、数字符号 (#) 和星号 (*) 等特殊字符进行匹配,可以将它们用方括号括起来。不能在一个组内使用右括号 (]) 与自身匹配,但在组外可以作为个别字符使用。

    通过在范围的上、下限之间用连字符 (–),charlist 可以指定字符的范围。例如,如果 string 中相应字符的位置包括 A–Z 之间的任意大写字母,则 [A-Z] 得到一个匹配。不需要分界符,方括号内就可以包括多个范围。

    指定范围的意义取决于运行时的有效字符排序(正如 Option Compare 和系统的国别设置所确定的,代码在运行之中)。使用 Option Compare Binary 示例可以看到,范围 [A–E] 与 A、B 和 E 相匹配。通过 Option Compare Text 可以看到,[A–E] 与 A, a, _, _, B, b, E, e 相匹配。此范围与 _ 或 _ 不匹配,因为按照排序顺序,重音字符在非重音字符之后。

    下面列举的是模式匹配的其它重要规则: 
    charlist 开头的惊叹号 (!) 意味着,如果在 string 中找到任何不属于 charlist 的字符,则存在一个匹配。如果在方括号之外使用惊叹号,则惊叹号与自身匹配。
    连字符 (–) 可以出现在 charlist 的开头(如果使用惊叹号,则在惊叹号之后),也可以出现在 charlist 的结尾与自身匹配。在任何其它地方,连字符用来识别字符的范围。
    当指定了字符范围时,这些字符必须按照升序(从最小到最大)顺序来显示。[A-Z] 是有效模式,但 [Z-A] 不是。
    字符序列 [] 被看作是长度为零的字符串 ("")。 
    某些语言的字母表中有一些特殊字符,它们表示两个分开的字符。例如,在一些语言中,当字符 "a" 与 "e" 同时出现时,用 "_" 来表示字符 "a" 与 "e"。Like 运算符可以辨认出单一的特殊字符和两个个别字符是否相等。

    当一个语言使用了一个特殊字符,而且这个字符在系统地区设置中已被指定的时候,在 pattern 或 string 中出现的单一特殊字符将与其他字符串中等价的两个字符相匹配。与此相似,由方括号括起来的 pattern 中的单一特殊字符(字符本身在列表或范围内)将与 string 中等价的两个字符序列匹配。

    def get_all_match_info():
        #like是数据库记性匹配的关键字   后面为匹配的规则
        #X表示找到以x开头,后面只有一位的数据
        #_多找位   就表示找到后面有几位的数据
        #cursor.execute('SELECT * FROM nameTable WHERE name LIKE "张_"')
        #cursor.execute('SELECT * FROM nameTable WHERE name LIKE "_王"')
        #%x表示找到所有以x结束的数据
        #cursor.execute('SELECT * FROM nameTable WHERE name LIKE "%李"')
        #x%表示找到所有以x开始的数据
        #cursor.execute('SELECT * FROM nameTable WHERE name LIKE "李%"')
        #%X%表示找到所有包含x的数据
        cursor.execute('SELECT * FROM nameTable WHERE name LIKE "%花%"')
        print(cursor.fetchall())
    get_all_match_info()

    Like 运算符
    用来比较两个字符串。
    语法
    result = string Like pattern
    Like 运算符的语法具有以下几个部分:
    部分 描述 
    result 必需的;任何数值变量。 
    string 必需的;任何字符串表达式。 
    pattern 必需的;任何字符串表达式,遵循“说明”中的模式匹配约定。 
    说明
    如果 string 与 pattern 匹配,则 result 为 True;如果不匹配,则 result 为 False。但是如果 string 或 pattern 中有一个为 Null,则 result 为 Null。

    Like 运算符的特性随着 Option Compare 语句而不同。每个模块的缺省字符串比较方法是 Option Compare Binary。

    在字符串比较中,Option Compare Binary 的结果是根据字符的内部二进制表示法导出的排序顺序得到的。在 Microsoft Windows 中,排序顺序由代码页决定。下例说明通常二进制的排序顺序:

    A < B < E < Z < a < b < e < z < _ < _ < _ < _ < _ < ?/FONT>

    在字符串比较中,Option Compare Text 的结果是字符串比较,它建立在不区分大小写的文本排序顺序基础上,而这一排序顺序是由系统的国别确定的。在对相同的字符使用 Option Compare Text 时会产生以下文本排序顺序:

    (A=a) < (_=_) < (B=b) < (E=e) < (_=_) < (Z=z) < (_=_) 

    内建的模式匹配功能提供了多种工具来进行字符串比较。有了模式匹配功能就可以使用通配符、字符串列表或字符区间的任何组合来匹配字符串。下列表格指出 pattern 中允许的字符以及它们与什么进行匹配:

    展开全文
  • 最近老大给了一个需求,是要写一个姓名的模糊查询。 问题很简单,难度在于这张表有将近500W数据。 如果要做中文的模糊查询,效率简直惨不忍睹。 网上查了一下资料,发现全文索引挺符合我的需要的。 结果,使用...

    最近老大给了一个需求,是要写一个姓名的模糊查询。

    问题很简单,难度在于这张表有将近500W条数据。

    如果要做中文的模糊查询,效率简直惨不忍睹。

    网上查了一下资料,发现全文索引挺符合我的需要的。

    结果,使用下来。其实并不太符合我的要求。

    全文索引的最小单位是词,如果不是在 in boolean mode 下是没办法 查询的

    其次,全文索引只支持 半模糊查询,我所谓的半模糊就是  xx like 'xx%'

    如果使用全模糊查询,建完索引之后,用 like 或者用 regexp 在常用关键词的时候 确实快很多。

    可以控制在0.1左右

    不过低频词还是很慢 需要10S

    所以,基于这种情况,可能还是做分表比较好

    或者修改需求 做半模糊查询。 

    下面是参考的资料 

    MySQL中的全文检索(1)

    MySQL使用全文索引(fulltext index)

     

    转载于:https://www.cnblogs.com/zeoblog/p/6929038.html

    展开全文
  • 模糊查询 like 引用索引分析 先直接给个结论,然后我们再分析 select * from table where name like 'jonny%'; select * from table where name like '%jonny%'; 如果 name 字段加了索引,第...
  • Mysql中文模糊查询问题

    千次阅读 2017-08-14 12:03:42
    * from usertest where username like binary '%夏%' ,就可以准确的查询出一记录来。 char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文...
  • 转载自:...查询语句的时候尽量避免全表扫描,使用全扫描,索引扫描!会引起全表扫描的几种SQL如下 1、模糊查询效率很低:  原因:like本身效率就比较低,应该尽量避免查询条件使用like;对于li...
  • java使用elasticsearch进行个条件模糊查询 文章说明: 1、本篇文章,本人会从java连接elasticsearch到查询结果生成并映射到具体实体类(涵盖分页功能) 2、代码背景:elasticsearch版本为:5.2.0; 3、本人以下...
  • 在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来。这个时候查询的效率就显得很...
  • javascript实现下拉列表框模糊查询

    万次阅读 2009-07-20 08:55:00
    var strGB="啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹...夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访...
  • Lucene的查询方式很 丰富,对于数值类型的数据,采取TermRangeQuery的方式,对于String类型的,就可以采取TermQuery等,查询方式了,可以通过采取合适的查询方式,检索到数据。Queryparser这个查询方式包含了其他几...
  • //查询所有 List<PmsProduct> list1 = pmsProductService.list(new QueryWrapper<PmsProduct>()); //根据条件查询 eq List<PmsProduct> list2 = pmsProductService.list(new QueryWrapper<...
  • 使用一简单的查询语句 mysql> select version(),current_date; mysql> select version();select now(); 新建或删除一个数据库 Mysql>create database mydb; Mysql> drop database mydb;   打开...
  • Oracle全文检索索引,存储过程,以及java方法调用高亮显示   Ajax实现全文检索和服务器端分页(原创) Oracle全文检索方面的研究(全)  2010-10-15 10:13:51| 分类: 数据库 |字号 订阅   参考...
  • 本文借鉴以下文章 http://foundy.blog.163.com/blog/static/2633834420090212202156/ http://foundy.blog.163.com/blog/static/2633834420100150439615/ ...第一步:利用matlab模糊控制工具箱设计模糊控制器。
  • 有关模糊pid的相关知识就把自己从刚接触到仿真出结果看到的大部分资料总结一下,以及一些自己的ps   以下未说明的都为转载内容   1.转自 https://blog.csdn.net/weixin_36340979/article/details/79168052 ...
  • 后来想想其实rowkey也没必要建立索引,你可以把需要搜索的信息放在列里,rowkey可以用UUID生成来保证每数据的唯一性,UUID就没必要作为搜索信息了吧。但强迫症的我还是想实现也能够对rowkey建立索引搜索,如果大家...
  • 在数据库系统概论第四版第三章96页的字符匹配当中指出,_(下划线)代表任意单个字符。根据书中前面的sql语句建立表格,并插入...现在没有任何问题,是我们想要的结果,但是如果打一个_(下划线)结果会是什么样呢?
  • 关于MongoDB的自定义条件查询OR/AND

    千次阅读 2019-01-10 14:36:02
    关于mongodb的自定义条件查询记录一下,主要是OR/AND/模糊查询需要注意一下 业务场景 根据创建人ID,未删除 以及自定义查询条件(name,address)的模糊查询来获取station集合 //2019-01-10获取当前登录人自己的场站 ...
  • * 商品条件查询 * @param keyWord * @return */ public static ArrayList searchProductIndexMore(String keyWord){ ArrayList list = new ArrayList() ; try { File indexdir = new File(productIndex)...
  • 关于高斯模糊网上已经有很不错的文章介绍了,在这里就不重复了。先来看一个效果 效果已经看到了,就来看看怎么实现的吧。首先是实现高斯模糊的核心代码 public static Bitmap blurBitmap(Bitmap bitmap, ...
  • MySQL模糊搜索优化

    万次阅读 2016-09-13 11:21:33
    InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有...对于FULLTEXT索引的内容可以使用MATCH()…AGAINST语法进行查询。  全文搜索的语法:  MATCH(col1,col2,…) AGAINST (expr[search_modifier])。
  • 数据库查询

    千次阅读 2014-04-23 15:47:50
    查询之外键: 主键:唯一标识一记录,不能有重复,不允许为空,用来保证数据完整性 外键是另一个表的主键,外键可以有重复的,可以是控制,用来和其他表建立联系。 例如 部门表中的主键id 员工表...
  • 概要:本文对Unity5中全新的三种Shader模板的源码进行了解析,然后还讲解了运动模糊屏幕特效的实现方法。 Unity5和之前的书写模式有了一定的改变。Unity5时代的Shader Reference官方文档也进一步地变得丰满。主要...
  • like查询后置% 索引竟然也失效

    千次阅读 2019-06-04 12:50:22
    昨天早上接到一个任务,查询某类商品,数据库用的是mysql,版本是5.6.37,es_product 表数据不多,两万多条。执行语句我简化了一下,类似下面的这条sql: SELECT * FROM es_product WHERE goods_code LIKE 'meiju%';...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,107
精华内容 8,042
关键字:

多条建模糊查询