我以这种格式在ElasticSearch中存储博客文章:
{
blog_id: keyword,
blog_article_id: keyword,
timestamp: date,
article_text: text
}
假设我想在过去30天内找到所有提及X的文章至少两次的所有博客。是否有一个简单的查询来查找在一个日期范围内至少有n次具有相同单词的文章的所有blog_id?这是对问题建模的正确方法,还是应该使用嵌套对象来简化查询?
可以在Kibana中将其记录为报告吗?
最佳答案
我想到的最简单的查询是
{
"_source": "blog_id",
"query": {
"bool": {
"must": [
{
"match": {
"article_text": "xyz"
}
},
{
"range": {
"timestamp": {
"gte": "now-30d"
}
}
}
]
}
}
}
相反,nested
对象很可能不会简化任何事情。Can it be made into a Kibana report?
当然。只需在KQL(基宾查询lang)中使用过滤器,或使用下拉列表并选择要跟踪的指标(总blog_id计数,时间序列频率等)
编辑发生的次数:
我知道两种方式:
term_vector
API,可为您提供word frequency信息,但它是独立的API,无法在查询时使用。function_score
-一个简单的 script query
就可以了。如果您有不重要的文档数量,则可能要花费很短的时间才能解决。在您的情况下,它可能看起来像这样:
{
"query": {
"bool": {
"must": [
{
"script": {
"script": {
"source": """
def word = 'xyz';
def docval = doc['article_text.keyword'].value;
String temp = docval.replace(word, "");
def no_of_occurences = ((docval.length() - temp.length()) / word.length());
return no_of_occurences >= 2;
"""
}
}
}
]
}
}
}
关于elasticsearch - 在时间范围内查找相同的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62863355/