我的目标是提供基于章/节的搜索功能。我将拥有与之相关的书,章和经文的内容。我希望搜索者能够通过以下搜索字词找到内容:

  • Luke-匹配该书的所有结果
  • Luke 1-全部用于书籍/章节
  • Luke 1-5-所有关于
  • 之间的书和章节
  • Luke 1:13-该章/节在其范围内的任何内容
  • Luke 1:2-7-该经文范围内的经文范围内的任何内容

  • 使用LIKE '%%'和mysql来完成此任务非常棘手,需要相当大的关系复杂性,而且似乎不是正确的解决方案。

    对于这种事情,Elasticsearch似乎是一种更好的方法,但是我希望从经验丰富的开发人员那里得到一些建议,以帮助他们从数据结构的 Angular 实现这一目标。

    是存储可能的每个经节的最佳方法(路加福音1:2,路加福音1:3,路加福音1:4),还是我有办法告诉 flex 搜索经文范围(第2-4节),并且会为我工作吗?

    最佳答案

    我认为您需要一个薄层逻辑将这些搜索查询转换为Elasticsearch过滤器。可能有比这更好的解决方案(我对分析字段和Lucene的工作还不多),但这就是我的想法。

    第一种选择是创建一个文档/节,这将创建约31k个文档,数量不多。这是要查询的最简单的数据模型。


    {
      "book": "Luke"
      "chapter": 1,
      "verse": 13,
      "contents": "But the angel said to him: Do not be afraid, Zechariah; your prayer has been heard. Your wife Elizabeth will bear you a son, and you are to call him John."
    }
    

    (我不喜欢使用名为"text"的字段,因为它也是ES映射上的关键字。)

    另一种选择是将经文存储为嵌套文档,您将获得一个文档/章节:
    {
      "book": "Luke"
      "chapter": 1,
      "verses": [
        {
          "verse": 12,
          "contents": "..."
        },
        {
          "verse": 13,
          "contents": "But the angel said to him: Do not be afraid, Zechariah; your prayer has been heard. Your wife Elizabeth will bear you a son, and you are to call him John."
        },
        {
          "verse": 14,
          "contents": "..."
        }
      ]
    }
    

    第三种选择是拥有一个文件/书:
    {
      "book": "Luke"
      "verses": [
        {
          "chapter": 1,
          "verse": 12,
          "contents": "..."
        },
        {
          "chapter": 1,
          "verse": 13,
          "contents": "But the angel said to him: Do not be afraid, Zechariah; your prayer has been heard. Your wife Elizabeth will bear you a son, and you are to call him John."
        },
        {
          "chapter": 1,
          "verse": 14,
          "contents": "..."
        }
      ]
    }
    

    实际上,嵌套的文档也算作文档,并且因为它们仅与根文档共享"book"字段,所以嵌套它们并不会带来太多好处。所以我会选择#1。

    我不知道ES / Lucene是否支持某种形式的部分文本标记,那么您只有一部文档/书。存储页码是一个类似的问题,人们建议仅存储1个文档/页。

    更新:

    根据我对Kibana的使用情况,我认为我可以构造一个有效的query string查询:
    {
      "query": {
        "query_string" : {
          "query" : "book:\"Luke\" AND chapter:3 AND verse:[5 TO 13]",
          "use_dis_max" : false
        }
      }
    }
    

    以我的理解,dis_max仅在“搜索”(评分和排名)上下文中相关,但是在这里,我们仅过滤精确匹配项,因此可以将其设置为false

    关于elasticsearch - 如何在 Elasticsearch 中构造基于圣经的查找,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42097159/

    10-17 03:10