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" }}} 
      ]
    }
  }
}

更多细节参见文档