Neo4j与Elasticsearch

Elasticsearch与Neo4j的组合让人眼前一亮,为什么要将搜索和图表结合呢?

互联网搜索引擎的推动下,全文搜索占据主导地位。图数据库在高度连接的领域支持事务和分析。两者结合可增强图的搜索效果,将高级搜索结果作为图遍历的入口点。

多元化搜索

亚马逊等众多零售商会经常用到搜索。文本搜索和目录导航不仅是用户的入口,还是重要的“销售人员”。与专业搜索引擎相比,“条目”搜索更加可控和规范。

场景

多个数据源

产品和相关信息来自异构源,如:产品供应商、信息提供者和经销商。

营销策略

使用新的促销、优惠和营销活动推广网站或产品。

个性化

提供更好、更个性化的用户体验,须捕获、处理用户行为,最终运用到个性化的搜索结果。

供应商信息

产品供应商是重要的信息,诸如数量、可用性、交付选项、时间以产品细节等。

所有这些需求和数据源都以多种方式影响搜索结果。为电商供应商设计搜索,需有一个完整的数据生态系统,和相关数据流管理平台。

价值

搜索是用户和搜索引擎间的对话,海量数据中查找相关信息的最快方法。搜索引擎需能够通过用户的搜索词,提供相关结果,进一步细化和过滤搜索。

Faceting(分组)

初始搜索结果通常过于宽泛,需过滤或细化,如,使用facets;Facets是从搜索结果派生的类别,用于缩小搜索范围。facet代表结构化信息属性,如:类别、价格、颜色、位置等,并包含结果的数量。

内部组成

Indexing(索引)

处理文档使其可用于搜索。索引是具有某些共同特征的文档集合,如,客户数据、产品目录、订单数据等,根据数据建立不同的索引。

User input(用户输入)

用户通过用户界面或API发送搜索请求。

Ranking(排名)

搜索引擎将输入与索引进行比较,并根据文档与查询的匹配程度对文档进行排序。

Results display(结果显示)

将结果返回给用户界面。

索引

分析、准备添加到索引的文档,以便在Lucene和相关结构中创建反向索引的数据结构,从而在搜索期间快速检索结果,以下是文档分析的步骤:

Tokenization

将字符串分解为要索引的令牌,对标点、数字和符号的一致处理。处理复合词以匹配可能的输入。

Downcasing

对不区分大小写的搜索,所有单词都转换为小写。

Stemming/stopword removal

去掉后缀、复数和共轭的单词。

Synonym expansion

删除常用词

最新的搜索引擎会保留它们以获得更好的结果,通过同义词库解析同义词并添加到索引中,同义词解析也可以在搜索词上进行。

创建索引

在Elasticsearch中,在索引创建过程中,可以指定以下选项:

索引的所有设置、碎片和副本数量、自定义分析。

如下示例中定义了文档和包含的字段,以及如何存储和索引映射。

PUT customers
{
    "settings" : {
        "number_of_shards" : 1,
        "number_of_replicas": 2
    },
    "mappings" : {
        "customer" : {
            "properties" : {
                "name" : { "type" : "keyword" },
                "description" : { "type" : "text", "analyzer": "english" }
            }
        }
    }
}

示例中,为customer的名称和描述字段,创建一个简单的索引,使用一个切分和两个副本。

注:有关创建Elasticsearch索引的更多细节参阅官网文档

搜索查询语言

Elasticsearch提供搜索API,和基于json的查询。

Json查询的DSL定义分两种类型:

叶子句(Leaf clauses)

检查字段中的特定值(例如,匹配、术语或范围查询)。这些可以单独使用。

复合子句(Compound clauses)

包装其他leaf或复合子句,以合理的方式组合它们(如bool或dis_max),或修改行为(如constant_score)。

查询子句行为取决于上下文

查询上下文:搜索与查询匹配的文档并根据相关性计算得分;过滤上下文:检查文档是否匹配,不计算分数。

GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}

更多细节可以参见文档