如何在 Elasticsearch 中建立 N-Gram 关系

问题描述

我是 Elasticsearch 的新手,我希望构建一个包含谚语列表的前端应用程序。当用户浏览这些谚语时,我希望他们从 Proverb DB 中找到相关的 N-Gram 谚语或分析谚语。例如当点击

“看着锅永远不会沸腾”会带来以下建议:

  • 1 克建议: “一盆两便”

  • 2-Gram 建议: “看着锅尝起来很苦”

  • 分析建议: “厨师太多了,把肉汤弄坏了”

有没有办法在 ES 中做到这一点,还是我需要构建自己的逻辑?

解决方法

1-gram 建议开箱即用,2-gram 建议可以通过 shingle 轻松实现。

这是一个尝试

PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "2-grams": {
          "type": "custom","tokenizer": "standard","filter": [
            "lowercase","shingles"
          ]
        }
      },"filter": {
        "shingles": {
          "type": "shingle","min_shingle_size": 2,"max_shingle_size": 2,"output_unigrams": false
        }
      }
    }
  },"mappings": {
    "properties": {
      "text": {
        "type": "text","analyzer": "standard","fields": {
          "2gram": {
            "type": "text","analyzer": "2-grams"
          }
        }
      }
    }
  }
}

接下来索引一些文档:

PUT test/_doc/1
{
  "text": "Two pees in a pot"
}

PUT test/_doc/2
{
  "text": "A Watched pot tastes bitter"
}

最后,您可以使用以下查询搜索 1-gram 建议,您将在响应中获得两个文档:

POST test/_search
{
  "query": {
    "match": {
      "text": "A watched pot never boils"
    }
  }
}

您还可以使用以下查询搜索 2-gram 建议,并且只会出现第二个文档:

POST test/_search
{
  "query": {
    "match": {
      "text.2gram": "A watched pot never boils"
    }
  }
}

PS:虽然不确定“分析”建议的工作原理,请随时提供更多见解,我会更新。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...