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