我正在构建一个问题机器人,直到现在我一直在使用mongodb。但是我只是发现了Elasticsearch,它看起来真的很强大。
我有一个“别名文档”数据库,这意味着每个文档都有一个“别名”字段,该字段包含有人可能称呼的可能名称的数组。
例如:
Events Collection:
{
name: "Birthday Party",
aliases: ["birthday", "birthday party", "birthday"],
place: "Tom's house"
},
{
name: "Bowling Night",
aliases: ["bowling", "bowling night"],
place: "Tom's Alley"
}
我的查询将是这样的句子:
“生日是几点钟?”
“保龄球在哪里?”
别名在数据库中是唯一的,因此在上述查询中,我希望它在第一个返回“生日聚会”文档,在第二个返回“保龄球之夜”文档。
我知道这是相当复杂的东西,目前我正在使用一种效率很低的方法,在该方法中,我将所有别名的数组保留在内存中,然后如果字符串包含它,则按它们进行搜索。
elasticsearch中是否存在可以执行以下操作的查询?
最佳答案
您可能并不需要做所有的“混叠”操作,Elasticsearch具有一些内置函数,这些函数将为您提供帮助,而且不会费劲!
例如,如果您索引以下文档:
{
"name": "Bowling Night"
}
默认情况下,
name
字段将另存为已分析的string
,这意味着Elasticsearch将为您标记并为其建立索引,因此在运行此查询时{
"query": {
"query_string": "Where is bowling?"
}
}
它将把句子分解成单独的单词,并在每个单词之间添加“OR”条件,因此将与您索引的文档匹配。如果您有多个匹配项(它可以匹配的单词越多,则得分越高),它还将为文档提供一个得分,并根据得分进行排序。
有关query string queries和Analyzers的更多信息
关于string - 在Elasticsearch中对关键字查询的句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38708198/