Neo4j和Elasticsearch
Neo4j和Elasticsearch是一種讓人眼前一亮的組合,為什么需要把搜索和圖表結合起來呢?它們是如何使用的呢?
在無處不在的互聯網搜索引擎的推動下,全文搜索占據了主導地位。圖形數據庫在高度連接的領域上支持事務性和分析性。將兩者結合在一起可以增強基於圖的搜索結果,比如推薦特性或概念搜索,還可以將高級搜索結果作為圖遍歷的入口點。
基於推薦的多元化搜索
以下是案例是產品搜索,零售商(亞馬遜,eBay,Target等)會經常用到。文本搜索和目錄導航不僅僅是用戶入口,還是主要的“銷售人員”。與專業的搜索引擎相比,這里說的搜索“條目”集更加可控和規范。
對於搜索基礎設施,需考慮到這些方面
多個數據源
產品和相關信息來自各種異構源,如產品供應商、信息提供者和銷售商。
營銷策略
創建新的促銷、優惠和營銷活動來推廣網站或特定產品。所有這些都會影響結果提升。
個性化
為了提供更好、更個性化的用戶體驗,必須捕獲、處理和使用:點擊、購買、搜索查詢等用戶行為來個性化搜索結果。
供應商信息
產品供應商是最重要的,它們提供諸如數量、可用性、交付選項、時間以及產品細節等信息。
所有這些需求和數據源都會以幾種方式影響搜索結果。為電商供應商設計搜索,需要一個完整的數據生態系統和相關數據流,用於管理他們的平台。
搜索的價值
搜索是用戶和搜索引擎之間的對話
搜索在現代應用中無處不在。是海量數據中查找相關信息的最快方法。搜索引擎需要能夠通過用戶的搜索詞提供相關結果,並進一步細化和過濾搜索。
Faceting(分組)
初始搜索結果通常過於寬泛,需要進行過濾或細化,例如,使用facets,Facets是從搜索結果派生的類別,用於縮小搜索范圍。
每個facet代表結構化信息的屬性,如類別,價格,顏色,位置等,並包含結果的數量。
搜索引擎內部組成
Indexing(索引)
處理文檔使其可用於搜索。
User input(用戶輸入)
用戶通過用戶界面或API發送搜索請求。
Ranking(排名)
搜索引擎將輸入與索引進行比較,並根據文檔與查詢的匹配程度對文檔進行排序。
Results display(結果顯示)
將結果返回給用戶界面。
索引是具有某些共同特征的文檔的集合,例如,客戶數據、產品目錄、訂單數據等,用這些數據建立不同的索引。
它由一個名稱標識(全小寫),用於對包含的文檔執行索引、搜索、更新和刪除操作。文檔是建立索引的基本信息單元,這些索引中存儲了任意數量的JSON文檔,文檔的類型不同。
Indexing
分析和准備添加到索引的文檔,以便在Lucene和其他相關結構中創建反向索引數據結構,從而在搜索期間快速檢索結果,這些是文檔分析的步驟:
Tokenization
將字符串分解為要索引的令牌
對標點、數字和其他符號的一致處理
處理復合詞的多個標記以匹配可能的輸入
Downcasing
對於不區分大小寫的搜索,所有單詞都轉換為小寫。
Stemming/stopword removal
去掉后綴、復數和共軛的單詞
Synonym expansion
刪除常用詞
更新的搜索引擎會保留它們以獲得更好的結果
通過同義詞庫解析同義詞並添加到索引中
另外,同義詞解析也可以在搜索詞上進行
創建索引的示例
在Elasticsearch中,在索引創建過程中,可以指定:
索引的所有設置
碎片和副本的數量
自定義分析
定義文檔和其包含的字段以及如何存儲和索引的映射。要為customer的名稱和描述字段(使用預定義的英文文本分析器)創建一個簡單的索引,需要使用一個切分和兩個副本:
PUT customers
{
"settings" : {
"number_of_shards" : 1,
"number_of_replicas": 2
},
"mappings" : {
"customer" : {
"properties" : {
"name" : { "type" : "keyword" },
"description" : { "type" : "text", "analyzer": "english" }
}
}
}
}
有關創建Elasticsearch索引的更多細節,請參閱官網文檔 。
搜索查詢語言(Search Query Language)
Elasticsearch提供搜索API和基於json的進行查詢定義的DSL。
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" }}}
]
}
}
}
更多細節可以參見文檔 。由於篇幅所限會在后續文章更新。
原文地址:https://cs.xieyonghui.com/database/neo4j-and-elasticsearch_88.html