Neo4j全文检索

作者: OhBonsai | 来源:发表于2019-02-19 21:05 被阅读8次

    全文检索基本概念

    • 搜索
      搜索这个行为是用户与搜索引擎的一次交互过程,用户需要找一些数据,他提供给搜索引擎一些约束条件.搜索引擎通过约束条件抽取一些结果给用户
    • 搜索引擎
      搜索引擎存在的目的是存储,查找和获取数据.Neo4j用的搜索引擎是Lucene
    • 文档
      在搜索软件中,文档是一等公民.存储,搜索,显示都是以文档为核心.文档简单可以理解为数据库中的一行数据,但是这行数据包括了field name.
    • 倒排索引
      倒排索引是搜索引擎中核心数据结构.简而言之,它将所有文档变成像是一本书后面词汇表的东西. 通过这种数据结构能够快速的从一个单词找到文档
    • Lucene搜索语法
    Query implementation Purpose Example
    TermQuery 单词匹配 neo4j
    PhraseQuery 短语匹配 "graph database"
    RangeQuery 范围匹配 [A TO Z] {A TO Z}
    WildcardQuery 正则匹配 g*p?, d??abase
    PrefixQuery 前缀匹配 algo*
    FuzzyQuery 后缀匹配 cipher~
    BooleanQuery 查询条件聚合 graph AND "shortest path"

    环境准备

    • 容器启动Neo4j
      docker run -p 17687:7687 -p 17474:7474 --name=neo4j-test neo4j:3.5.3
    • 创建数据, 使用测试数据.
      :play northwind-graph

    Neo4j全文检索

    Neo4j全文检索有以下特性,不过用下来最重要的我感觉是创建索引的语句实际上只是创建于给命名控件. Neo4j从2.2.x时代开始就默认开启node_auto_indexing=true. 倒排索引在数据插入时候已经创建了. 创建索引/删除索引代价是非常小的

    • 支持关系与节点的索引
    • 支持常用analyzers扩展
    • 可以使用lucene query语句
    • 可以返回查询结果评分
    • 对索引自动更新
    • 单索引文档数量不限

    索引创建与删除

    建立两个索引, 一个是Product的该标签的索引. 另外一个全数据库全文检索的索引

    call db.index.fulltext.createNodeIndex("all",['Product', 'Category', 'Supplier'],['reorderLevel', 'unitsInStock', 'unitPrice', 'supplierID', 'productID', 'discontinued', 'quantityPerUnit', 'categoryID', 'unitsOnOrder', 'productName', 'description', 'categoryName', 'picture', 'country', 'address', 'contactTitle', 'city', 'phone', 'contactName', 'postalCode', 'companyName', 'fax', 'region', 'homePage'])
    
    call db.index.fulltext.createNodeIndex("product",['Product'],['reorderLevel', 'unitsInStock', 'unitPrice', 'supplierID', 'productID', 'quantityPerUnit', 'discontinued', 'productName', 'unitsOnOrder', 'categoryID'])
    

    删除索引

    call db.index.fulltext.drop("all")
    

    可以通过函数获取所有标签和属性

    call db.propertyKeys
    call db.labels
    

    查询

    这里面的查询非常简单.只要记住一个语句就能应付大多数场景

    call db.index.fulltext.queryNodes(
        'all',        //这里索引名
        'Av'          // lucene查询语句
    ) yield node
    where node.address contains "12"   // where语句
    return node 
    order by node.address  // order skip limit
    skip 0
    limit 1
    

    相关文章

      网友评论

        本文标题:Neo4j全文检索

        本文链接:https://www.haomeiwen.com/subject/owxqyqtx.html