Elasticsearch-计算文档中关键词出现的次数

时间:2019-07-08 09:49:15

标签: php elasticsearch

数据库:Elasticsearch v7.2
应用程序:Laravel v5.7
使用Elasticsearch / Elasticsearch(https://github.com/elastic/elasticsearch-php)官方PHP库

我在Elasticsearch的query_string查询中使用此代码来检索我在整个索引中搜索时具有特定短语的文档

[
    "query_string" => [
        "default_field" => $content,
        "query" => $keywords
    ]
],

$keywords变量包含:

("MCU" OR "Marvel" OR "Spiderman")

现在,我想在我要检索的文档中计算这些单词的出现次数

我将aggs查询与此配合使用

'aggs' => [
    'count' => [
        'terms' => [
            'field' => 'content.keyword'
        ]
    ]
]

但是,我不知道如何关联这些doc_count并以匹配的方式显示它们-因为键本身是内容,而不是ID

enter image description here

我打算显示整个文档,并将每个文档中上述$keywords发生了多少次Mentions

enter image description here 还有没有其他方法可以在Elasticsearch中不使用aggs来进行事件计数?

3 个答案:

答案 0 :(得分:1)

如果您只想统计关键字的出现次数,则不必启用字段数据,请尝试将过滤器aggs与查询一起使用

GET my_index/_search
{
  "query": {
    "query_string": {
      "default_field": "content", 
      "query": "MCU OR Marvel OR Spiderman"
    }
  },
  "aggs": {
    "count": {
      "filters": {
        "filters": {
          "mcu": {
            "match": {
              "content": "MCU"
            }
          },
          "marvel": {
            "match": {
              "content": "Marvel"
            }
          },
          "spiderman": {
            "match": {
              "content": "Spiderman"
            }
          }
        }
      }
    }
  }
}

结果如下:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 1.219939,
    "hits": [
      ....
      ....
    ]
  },
  "aggregations": {
    "count": {
      "buckets": {
        "marvel": {
          "doc_count": 2
        },
        "mcu": {
          "doc_count": 2
        },
        "spiderman": {
          "doc_count": 1
        }
      }
    }
  }
}

来源:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filters-aggregation.html

答案 1 :(得分:0)

启用Fieldata可能不是启用文本搜索的最佳方法。

https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html#before-enabling-fielddata

  

在启用字段数据之前,请考虑为什么将文本字段用于聚合,排序或在脚本中使用。这样做通常没有任何意义。

     

在索引之前分析文本字段,以便可以通过搜索new或york来找到类似New York的值。当您可能想要一个名为New York的存储桶时,此字段上的术语汇总将返回一个新的存储桶和一个纽约存储桶。      

相反,您应该有一个用于全文本搜索的文本字段,以及一个为聚合启用doc_values的未分析的关键字字段,如下所示:

PUT my_index
{
  "mappings": {
    "properties": {
      "my_field": { 
        "type": "text",
        "fields": {
          "keyword": { 
            "type": "keyword"
          }
        }
      }
    }
  }
}

答案 2 :(得分:0)

感谢@AshrafulIslam先生,我得以提出Elasticsearch的{​​{1}}功能。尽管highlights从字面上强调出现的关键字,但我还是借助PHP的highlights函数来计算substr_count()标签

我将此代码添加为<em>元素的同级元素:

['body']['query']

然后,当我遍历"highlight" => [ "fields" => [ "content" => ["number_of_fragments" => 0] ], 'require_field_match' => false ] 数组元素时,我执行了以下操作:

['hits']['hits']