Elasticsearch学习搜索的笔记

1.普通查询(全文搜索)
查询name=Smith的文档数据
GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "name" : "smith"
        }
    }
}
备注:
返回结果当中存在max_score和每个记录当中的_score表示最大相关性分数和该记录的相关性分数

2.组合查询
查询name=smith并且年龄大于30岁
GET /megacorp/employee/_search?pretty
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "name" : "smith" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            }
        }
    }
}

3.短语搜索
查询about字段当中包含rock和climbing并且rock climbing相连
GET /megacorp/employee/_search?pretty
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}

4.高亮搜索
GET /megacorp/employee/_search?pretty
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}

5.聚合查询-分析
按照interests字段进行聚合
GET /megacorp/employee/_search?pretty
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
}
报错:illegal_argument_exception
原因:Fielddata is disabled on text fields by default
解决办法:
PUT /megacorp/_mapping/employee
{
   "employee": {
      "properties": {
        "interests": {
          "type": "text",
          "fielddata": true
        }
      }
   }
}
备注:
interests是要聚合的字段名
查询结果当中all_interests是分析结果

6.分级汇总-分析
按照interests字段进行聚合,然后计算age平均年龄
GET /megacorp/employee/_search
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}
备注:
avg_age是聚合结果当中新增字段

倒排索引

倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。

有两种不同的反向索引形式:

一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表。

一个单词的水平反向索引(或者完全反向索引)又包含每个单词在一个文档中的位置。[1]

后者的形式提供了更多的兼容性(比如短语搜索),但是需要更多的时间和空间来创建。

 

参考资料

维基百科:https://zh.wikipedia.org/wiki/%E5%80%92%E6%8E%92%E7%B4%A2%E5%BC%95

云栖社区:https://yq.aliyun.com/articles/38228

Elasticsearch配置

一、术语
1、索引(index)
相当于关系数据库当中的数据库
2、文档(document)
相当于MySQL中的一行记录,但是ES中的文档没有固定结构
3、文档类型(type)
一个索引当中可以用不同的文档类型代表不同的数据集合
4、节点(node)
一个节点就是一个实例
5、集群(cluster)
一个集群可以有一个或者多个节点组成(同一个集群下的节点名不能重复)
6、分片(shards)
一个索引会被分割成多个分片,分别存放在集群的不同节点
7、副本

每个分片可以设置多个副本,可以用来容错和提高查询性能

一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。

Continue reading

Lucenu和Sphinx介绍

一、Lucene介绍

1、简介

Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

2、官网

http://lucene.apache.org/

3、优点

成熟的解决方案,有很多的成功案例。apache 顶级项目,正在持续快速的进步。基于JAVA,庞大而活跃的开发社区,大量的开发人员。它只是一个类库,有足够的定制和优化空间:经过简单定制,就可以满足绝大部分常见的需求;经过优化,可以支持 10亿+ 量级的搜索。

4、缺点

需要额外的开发工作。所有的扩展,分布式,可靠性等都需要自己实现;非实时,从建索引到可以搜索中间有一个时间延迟,而当前的“近实时”(Lucene Near Real Time search)搜索方案的可扩展性有待进一步完善

5、产品

Solr,Nutch,Hbase,Katta,constellio,Summa,Compass,Bobo Search,Index Tank,Elastic Search,Hadoop contrib/index ,LinkedIn ,Eclipse,Cocoon

二、Shinx介绍

1、简介

Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。Sphinx是一个用C++语言写的开源搜索引擎,也是现在比较主流的搜索引擎之一,在建立索引的事件方面比Lucene快50%,但是索引文件比Lucene要大一倍,因此Sphinx在索引的建立方面是空间换取事件的策略,在检索速度上,和lucene相差不大,但检索精准度方面Lucene要优于Sphinx,另外在加入中文分词引擎难度方面,Lucene要优于Sphinx.其中Sphinx支持实时搜索,使用起来比较简单方便

2、官网

http://sphinxsearch.com/

3、优点

建立索引比Lucene要快

高性能的搜索

可处理大量数据

支持分布式搜索

提供文档摘要

可作为MYSQL的存储引擎提供搜索服务

较多语言的API

6、缺点

中文分词需要分词后使用

索引文件较大

非基于Apache软件基金会