search_searchview - CSDN
精华内容
参与话题
  • Search()函数使用方法

    千次阅读 2014-01-17 09:13:56
  • 何为正则表达式?正则表达式,又称规则表达式,英文名为RegularExpression,在代码中常简写为regex、regexp或RE,是计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(Patterns)的文本。...

    何为正则表达式?

    正则表达式,又称规则表达式,英文名为RegularExpression,在代码中常简写为regex、regexp或RE,是计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(Patterns)的文本。

    正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。

    Find Patterns in Text(文本查找模式)

    关于re的最常见用法是在文本中搜索模式

    常用re.search()

    string进行搜索,成功返回Match object, 失败返回None, 只匹配一个

    search(pattern, string, flags=0):

    """Scan through string looking for a match to the pattern, returning

    a match object, or None if no match was found."""


    例子1:

    import re
    
    patterns = [ 'this', 'that' ]
    text = 'Does this text match the pattern?'
    
    for pattern in patterns:
        print 'Looking for "%s" in "%s" ->' % (pattern, text),
    
        if re.search(pattern,  text):
            print 'found a match!'
        else:
            print 'no match'

           例子2:

    import re
    
    pattern='this' #AB
    text='Does this text match the pattern ?'
    
    match=re.search(pattern,text)
    
    if match:   
        s = match.start()
        e = match.end()
        print('Found "%s" in "%s" from %d to %d("%s")' % \
              (pattern,text, s, e, text[s:e]))
    else:
        print('No found')

    参考:

    [1]https://baike.sogou.com/v107588.htm?fromTitle=正则表达式

    [2]https://pymotw.com/2/re/#finding-patterns-in-text



    展开全文
  • 正则系列2: re.search用法

    千次阅读 2019-04-22 18:12:32
    re.search re.search扫描整个字符串并返回第一个成功的匹配。 该方法有3个参数,第一个就是你写的正则表达式,第二个匹配的目标字符串,第三个是一个匹配模式 re.search(pattern, string, flags=0) 先看一个re...

    re.search

    re.search扫描整个字符串并返回第一个成功的匹配。
    该方法有3个参数,第一个就是你写的正则表达式,第二个匹配的目标字符串,第三个是一个匹配模式
    re.search(pattern, string, flags=0)

    • 先看一个re.match例子,之后我们对比search。
    #我们需要拿到Hello 1234567 World_This is a Regex Demo 这一部分
    import re
    
    content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
    result = re.match('Hello.*?(\d+).*?Demo',content)
    print(result)
    

    结果:
    None

    我们发现用match的输出结果是None,也就是说pattern最开头和content字符串最开头是不匹配的。那么整个的匹配就会失败。

    • 接下来看re.search,代码不变,只是re.match变成re.search,来看下结果
    import re
    
    content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
    result = re.search('Hello.*?(\d+).*?Demo',content)
    print(result)
    print(result.group(1))
    

    结果:
    <_sre.SRE_Match object; span=(13, 53), match=‘Hello 1234567 World_This is a Regex Demo’>
    1234567

    也就是说pattern搜索的时候,是从字符串Extra开始的,用match的话,正则表达式从Hello开始是不行的,但用re.search就会搜索,不会管开头一致不一致。

    总结:为匹配方便,能用search就不用match,match方法限定匹配时,头部必须是一致的

    • 匹配演练:最后我们做些匹配演练,实战下
    import re
    
    html='''<div id="songs-list">
        <h2 class="title">经典老歌</h2>
        <p class="introduction">
            经典老歌列表
        </p>
        <ul id ="list" class="list-group">
            <li data-view="2">一路上有你</li>
            <li data-view="7">
                <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
            </li>
            <li data-view="4" class="active">
                <a href="/3.mp3" singer="齐秦">往事随风</a>
            </li>
            <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
            <li data-view="5"><a href="/5.mp3" singer="陈惠琳">记事本</a></li>
            <li data-view="5">
                <a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
            </li>
        </ul>
    </div>
    '''
    

    上面是html代码,要求匹配出 第3个li标签中的齐秦 往事随风 ,代码如下:

    result = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>',html,re.S)#re.S确保.能匹配到换行符
    if result:
        print(result.group(1),result.group(2))
    

    结果:
    齐秦 往事随风

    我们还要求匹配出第二个li标签中的内容 任贤齐 沧海一声笑

    result = re.search('<li.*?singer="(.*?)">(.*?)</a>',html,re.S)
    if result:
        print(result.group(1),result.group(2))
    

    结果:
    任贤齐 沧海一声笑

    如果匹配时候不需要匹配换行符,那么参数中就没必要带re.S,比如匹配第4个和第5个li标签中的歌手和歌名。但是re.search也仅仅是返回一个符合匹配的结果。如果我们要返回符合匹配的所有结果,要用到re.findall。这一节的re.search就说到这里。

    展开全文
  • ElasticSearch简介

    万次阅读 多人点赞 2020-09-14 11:07:07
    摘自Elasticsearch-基础介绍及索引原理分析 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单...

    摘自Elasticsearch-基础介绍及索引原理分析

    Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:

    • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
    • 实时分析的分布式搜索引擎。
    • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

     

    一、基本概念

    先说Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:

    {
        "name" :     "John",
        "sex" :      "Male",
        "age" :      25,
        "birthDate": "1990/05/01",
        "about" :    "I love to go rock climbing",
        "interests": [ "sports", "music" ]
    }

     用Mysql这样的数据库存储就会容易想到建立一张User表,有balabala的字段等,在Elasticsearch里这就是一个文档,当然这个文档会属于一个User的类型,各种各样的类型存在于一个索引当中。

    这里有一份简易的将Elasticsearch和关系型数据术语对照表:

    关系数据库      ⇒ 数据库        ⇒  表         ⇒ 行              ⇒ 列(Columns)
    
    Elasticsearch  ⇒ 索引(Index)   ⇒ 类型(type)  ⇒ 文档(Docments)  ⇒ 字段(Fields)  

     一个 Elasticsearch 集群可以包含多个索引(数据库),也就是说其中包含了很多类型(表)。这些类型中包含了很多的文档(行),然后每个文档中又包含了很多的字段(列)。Elasticsearch的交互,可以使用Java API,也可以直接使用HTTP的Restful API方式,比如我们打算插入一条记录,可以简单发送一个HTTP的请求:

    PUT /megacorp/employee/1  
    {
        "name" :     "John",
        "sex" :      "Male",
        "age" :      25,
        "about" :    "I love to go rock climbing",
        "interests": [ "sports", "music" ]
    }

    更新,查询也是类似这样的操作。

     

    二、 索引

    Elasticsearch最关键的就是提供强大的索引能力。

    Elasticsearch索引的精髓:

    一切设计都是为了提高搜索的性能

    另一层意思:为了提高搜索的性能,难免会牺牲某些其他方面,比如插入/更新,否则其他数据库不用混了。前面看到往Elasticsearch里插入一条记录,其实就是直接PUT一个json的对象,这个对象有多个fields,比如上面例子中的name, sex, age, about, interests,那么在插入这些数据到Elasticsearch的同时,Elasticsearch还默默1的为这些字段建立索引--倒排索引,因为Elasticsearch最核心功能是搜索。

     

    三、Elasticsearch是如何做到快速索引的

    Elasticsearch使用的倒排索引比关系型数据库的B-Tree索引快,为什么呢?

    什么是B-Tree索引?

    上大学读书时老师教过我们,二叉树查找效率是logN,同时插入新的节点不必移动全部节点,所以用树型结构存储索引,能同时兼顾插入和查询的性能。因此在这个基础上,再结合磁盘的读取特性(顺序读/随机读),传统关系型数据库采用了B-Tree/B+Tree这样的数据结构:

    为了提高查询的效率,减少磁盘寻道次数,将多个值作为一个数组通过连续区间存放,一次寻道读取多个数据,同时也降低树的高度。

    什么是倒排索引?

    继续上面的例子,假设有这么几条数据(为了简单,去掉about, interests这两个field):

    | ID | Name | Age  |  Sex     |
    | -- |:------------:| -----:| -----:| 
    | 1  | Kate         | 24 | Female
    | 2  | John         | 24 | Male
    | 3  | Bill         | 29 | Male

    ID是Elasticsearch自建的文档id,那么Elasticsearch建立的索引如下:

    Name:

    | Term | Posting List |
    | -- |:----:|
    | Kate | 1 |
    | John | 2 |
    | Bill | 3 |

    Age:

    | Term | Posting List |
    | -- |:----:|
    | 24 | [1,2] |
    | 29 | 3 |

    Sex:

    | Term | Posting List |
    | -- |:----:|
    | Female | 1 |
    | Male | [2,3] |

    Posting List

    Elasticsearch分别为每个field都建立了一个倒排索引,Kate, John, 24, Female这些叫term,而[1,2]就是Posting List。Posting list就是一个int的数组,存储了所有符合某个term的文档id。

    看到这里,不要认为就结束了,精彩的部分才刚开始...

    通过posting list这种索引方式似乎可以很快进行查找,比如要找age=24的同学,爱回答问题的小明马上就举手回答:我知道,id是1,2的同学。但是,如果这里有上千万的记录呢?如果是想通过name来查找呢?

    Term Dictionary

    Elasticsearch为了能快速找到某个term,将所有的term排个序,二分法查找term,logN的查找效率,就像通过字典查找一样,这就是Term Dictionary。现在再看起来,似乎和传统数据库通过B-Tree的方式类似啊,为什么说比B-Tree的查询快呢?

    Term Index

    B-Tree通过减少磁盘寻道次数来提高查询性能,Elasticsearch也是采用同样的思路,直接通过内存查找term,不读磁盘,但是如果term太多,term dictionary也会很大,放内存不现实,于是有了Term Index,就像字典里的索引页一样,A开头的有哪些term,分别在哪页,可以理解term index是一颗树:

    所以term index不需要存下所有的term,而仅仅是他们的一些前缀与Term Dictionary的block之间的映射关系,再结合FST(Finite State Transducers)的压缩技术,可以使term index缓存到内存中。从term index查到对应的term dictionary的block位置之后,再去磁盘上找term,大大减少了磁盘随机读的次数。

    这时候爱提问的小明又举手了:"那个FST是神马东东啊?"

    一看就知道小明是一个上大学读书的时候跟我一样不认真听课的孩子,数据结构老师一定讲过什么是FST。但没办法,我也忘了,这里再补下课:

    FSTs are finite-state machines that map a term (byte sequence) to an arbitrary output.

    假设我们现在要将mop, moth, pop, star, stop and top(term index里的term前缀)映射到序号:0,1,2,3,4,5(term dictionary的block位置)。最简单的做法就是定义个Map<string, integer="">,大家找到自己的位置对应入座就好了,但从内存占用少的角度想想,有没有更优的办法呢?答案就是:FST。

     

    FSTs are finite-state machines that map a term (byte sequence) to an arbitrary output.

    FST以字节的方式存储所有的term,这种压缩方式可以有效的缩减存储空间,使得term index足以放进内存,但这种方式也会导致查找时需要更多的CPU资源。

    后面的更精彩,看累了的同学可以喝杯咖啡……

    压缩技巧

    Elasticsearch里除了上面说到用FST压缩term index外,对posting list也有压缩技巧。 
    小明喝完咖啡又举手了:"posting list不是已经只存储文档id了吗?还需要压缩?"

    嗯,我们再看回最开始的例子,如果Elasticsearch需要对同学的性别进行索引(这时传统关系型数据库已经哭晕在厕所……),会怎样?如果有上千万个同学,而世界上只有男/女这样两个性别,每个posting list都会有至少百万个文档id。 Elasticsearch是如何有效的对这些文档id压缩的呢?

    Frame Of Reference

    增量编码压缩,将大数变小数,按字节存储

    首先,Elasticsearch要求posting list是有序的(为了提高搜索的性能,再任性的要求也得满足),这样做的一个好处是方便压缩,看下面这个图例: 

    如果数学不是体育老师教的话,还是比较容易看出来这种压缩技巧的。

    原理就是通过增量,将原来的大数变成小数仅存储增量值,再精打细算按bit排好队,最后通过字节存储,而不是大大咧咧的尽管是2也是用int(4个字节)来存储。

    Roaring bitmaps

    说到Roaring bitmaps,就必须先从bitmap说起。Bitmap是一种数据结构,假设有某个posting list:

    [1,3,4,7,10]

    对应的bitmap就是:

    [1,0,1,1,0,0,1,0,0,1]

    非常直观,用0/1表示某个值是否存在,比如10这个值就对应第10位,对应的bit值是1,这样用一个字节就可以代表8个文档id,旧版本(5.0之前)的Lucene就是用这样的方式来压缩的,但这样的压缩方式仍然不够高效,如果有1亿个文档,那么需要12.5MB的存储空间,这仅仅是对应一个索引字段(我们往往会有很多个索引字段)。于是有人想出了Roaring bitmaps这样更高效的数据结构。

    Bitmap的缺点是存储空间随着文档个数线性增长,Roaring bitmaps需要打破这个魔咒就一定要用到某些指数特性:

    将posting list按照65535为界限分块,比如第一块所包含的文档id范围在0~65535之间,第二块的id范围是65536~131071,以此类推。再用<商,余数>的组合表示每一组id,这样每组里的id范围都在0~65535内了,剩下的就好办了,既然每组id不会变得无限大,那么我们就可以通过最有效的方式对这里的id存储。

    联合索引

    上面说了半天都是单field索引,如果多个field索引的联合查询,倒排索引如何满足快速查询的要求呢?

    • 利用跳表(Skip list)的数据结构快速做“与”运算,或者
    • 利用上面提到的bitset按位“与”

    先看看跳表的数据结构:

    将一个有序链表level0,挑出其中几个元素到level1及level2,每个level越往上,选出来的指针元素越少,查找时依次从高level往低查找,比如55,先找到level2的31,再找到level1的47,最后找到55,一共3次查找,查找效率和2叉树的效率相当,但也是用了一定的空间冗余来换取的。

    假设有下面三个posting list需要联合索引:

    如果使用跳表,对最短的posting list中的每个id,逐个在另外两个posting list中查找看是否存在,最后得到交集的结果。

    如果使用bitset,就很直观了,直接按位与,得到的结果就是最后的交集。

     

    四、总结和思考

    Elasticsearch的索引思路:

    将磁盘里的东西尽量搬进内存,减少磁盘随机读取次数(同时也利用磁盘顺序读特性),结合各种奇技淫巧的压缩算法,用及其苛刻的态度使用内存。 

    所以,对于使用Elasticsearch进行索引时需要注意:

    • 不需要索引的字段,一定要明确定义出来,因为默认是自动建索引的
    • 同样的道理,对于String类型的字段,不需要analysis的也需要明确定义出来,因为默认也是会analysis的
    • 选择有规律的ID很重要,随机性太大的ID(比如java的UUID)不利于查询

    关于最后一点,个人认为有多个因素:

    其中一个(也许不是最重要的)因素: 上面看到的压缩算法,都是对Posting list里的大量ID进行压缩的,那如果ID是顺序的,或者是有公共前缀等具有一定规律性的ID,压缩比会比较高;

    另外一个因素: 可能是最影响查询性能的,应该是最后通过Posting list里的ID到磁盘中查找Document信息的那步,因为Elasticsearch是分Segment存储的,根据ID这个大范围的Term定位到Segment的效率直接影响了最后查询的性能,如果ID是有规律的,可以快速跳过不包含该ID的Segment,从而减少不必要的磁盘读次数。

    展开全文
  • javascript 操作 url 中 search 部分方法函数前言首先,我们需要知道什么是 search , search 是 window.location 的一个属性.举个例子:首先,我们这里有一个 url,是 ...
  • Python3 re.search()方法

    万次阅读 2019-05-05 20:18:11
    re.search()方法扫描整个字符串,并返回第一个成功的匹配。如果匹配失败,则返回None。 与re.match()方法不同,re.match()方法要求必须从字符串的开头进行匹配,如果字符串的开头不匹配,整个匹配就失败了; re....
  • elasticsearch 常见查询及聚合的JAVA API

    万次阅读 多人点赞 2018-12-17 10:31:43
    最近在研究ES 有点心得记录下备忘  ES 常见查询 根据ID 进行单个查询 GetResponse response = client.prepareGet("accounts", "person"... .setOperationThreaded(false) ...
  • 进入上面的文章就能找到解决方法 ...配置了国内镜像源(比如阿里的docker镜像源)是对search没有用的,因为docker命令最后还是通过他自己的地址搜索镜像 但是配置了国内镜像源可以加快pull拉去镜像的速度 ...
  • Elasticsearch在后台启动

    万次阅读 2016-04-21 09:30:10
    Elasticsearch在linux下使用命令sh elasticsearch start,按键ctrl+c的时候程序就会stop掉,如何将程序在后台启动呢? 需要使用:./elasticsearch -d 这时执行的时候会出现没有权限./elasticsearch: Permission ...
  • windows 下安装elasticsearch

    万次阅读 热门讨论 2017-08-30 16:00:59
    之前讲了 linux下elasticsearch 安装、配置及示例,本文是在Windows环境下安装elasticserach。1.下载2017-8-25博文更新 —-下载地址 原elasticsearch下载地址失效,请点此下载elasticsearch-5.5.0因为es5.5.0的文件...
  • Elasticsearch下载安装

    万次阅读 多人点赞 2019-07-31 19:26:09
    注:Elasticsearch 需要 Java 8 环境,在安装Elasticsearch之前先安装好JDK。 1、Windows版 1.1、下载 访问官网的下载地址:https://www.elastic.co/downloads/elasticsearch,windows版的下载ZIP格式的。 如果...
  • [IOS] Xcode中 Search Paths的设置

    万次阅读 2014-04-29 13:54:35
    Xcode Header Path的设置。 在 Xcode Build Setting 中...而User Header Search Paths只有在Always Search User Paths为Yes时才会被搜索。 Project的设置默认并不被Targets继承,只有当Targets的设置加入了$(inh
  • BeamSearch的理解

    万次阅读 2018-03-07 17:52:23
    BeamSearch的理解 转自知乎问题“谁能解释下seq2seq中的beam search算法过程?”高分回答 https://www.zhihu.com/question/54356960
  • Elasticsearch 作为开源领域的后起之秀,从2010年至今得到飞跃式的发展。 Elasticsearch 以其开源、分布式、RESTFul API 三大优势,已经成为当下风口中“会飞的猪”。 阿里云2018年2月5日已开价50-200W年薪招聘技术...
  • Elasticsearch启动和停止

    万次阅读 2018-08-16 15:51:22
    通过后台启动并且指定pid文件 $ ./bin/elasticsearch -p /tmp/elasticsearch-pid -d 找到pid号通过kill命令停止 $ cat /tmp/elasticsearch-pid &amp;&amp; echo 15516 $ kill -SIGTERM 15516...
  • 有一种情况,当我们启动elasticsearch之后, 经过很长一段时间没有操作, 自己已经忘了是否已经启动了elasticsearch, 这时候我们可以通过下面的方式验证是否启动,并重新启动: step1 查找ES进程号 ps -ef | ...
  • Elasticsearch环境搭建和介绍(Windows)

    万次阅读 多人点赞 2020-03-25 19:21:08
    1 Elasticsearch介绍和安装 1.1 简介 1.1.1 Elastic Elastic官网:https://www.elastic.co/cn/ Elastic有一条完整的产品线:Elasticsearch、Kibana、Logstash等,前面说的三个就是大家常说的ELK技术栈。 ...
  •  参考地址:https://github.com/spring-projects/spring-data-elasticsearch/blob/master/README.md...spring data elasticsearch elasticsearch 3.1.x 6.2.2 3.0.x 5.5.0 2.1.x 2.4.0 2.0.x...
  • ElasticSearch-2.2 windows 安装

    万次阅读 2016-06-17 08:47:46
    1、下载ElasticSearch-2.2.0安装包...2、解压缩并安装:CMD窗口运行 elasticsearch.bat(或者直接双击elasticsearch.bat运行) 3、现在在浏览器里测试一下:http://localhost:9200/ 4、安装ElasticSearch Head插件
  • ElasticSearch7.0.0安装sql

    万次阅读 2020-04-08 11:23:58
    切换到elasticsearch的home目录执行: bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/7.0.0.0/elasticsearch-sql-7.0.0.0.zip 修改config/elasticsearch....
1 2 3 4 5 ... 20
收藏数 1,091,932
精华内容 436,772
关键字:

search