弹性标记为所有可能的单词cominations

时间:2017-08-24 14:54:54

标签: elasticsearch combinations elasticsearch-5 elasticsearch-2.0

鉴于输入“快速棕色狐狸跳”我想为单词创建所有可能的令牌组合。因此,示例字符串将被标记为

[
"quick", "quick brown", "quick fox", "quick jumped",
"brown", "brown quick", "brown fox", "brown jumped",
                      ...,
"jumped quick", "jumped brown", "jumped fox", "jumped"
]

我可以使用shingle tokeniser但它只会通过连接相邻的术语来创建新的令牌,我最终得到:

[
"quick", "quick brown", "quick brown fox", "quick brown fox jumped",
"brown", "brown fox", "brown fox jumped",
"fox", "fox jumped",
"jumped"
]

这是向前迈出的正确的一步,但不是我想要的东西。

1 个答案:

答案 0 :(得分:0)

在您的评论中,您说这里的用例是获取文档中出现的单词组合的聚合。您可以使用标准tokenizer,仍然可以获取该信息。例如,假设您拥有带有" body"的文档。字段:

  

1:快速的棕色狐狸跳过小狗

     

2:小狗吃了一些食物

所以我想你想看到类似的东西:

  小狗:2

     小p:2

     狗:2:

     吃的是:1

     

...

然后你可以像这样查询:

{
  "size": 0,
  "aggs": {
    "firstlevel": {
      "terms": {
        "field": "body"
      },
      "aggs": {
        "secondlevel": {
          "terms": {
            "field": "body"
          }
        }
      }
    }
  }
}

你得到的反应如下:

"aggregations": {
  "firstlevel": {
  "doc_count_error_upper_bound": 0,
  "sum_other_doc_count": 1,
  "buckets": [
    {
      "key": "dog",
      "doc_count": 2,
      "secondlevel": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 1,
        "buckets": [
          {
            "key": "dog",
            "doc_count": 2
          },
          {
            "key": "little",
            "doc_count": 2
          },
          {
            "key": "the",
            "doc_count": 2
          },
          {
            "key": "brown",
            "doc_count": 1
          }
       ...

你可以看到"小"和#34;狗"共同出现在2个文档中,"""和#34;狗"共同出现在2个文件中," dog"和"棕色"共同出现在1份文件中。当然,这仅适用于唯一共生次数。

如果你真的需要像你所描述的那样拥有令牌,我认为你必须编写代码才能做到这一点(Lucene的自定义标记器,你可以从Elasticsearch使用,或者可能更容易,一个pre - 处理步骤,添加一个“keyword s列表”的字段。