首页 > 解决方案 > Elasticsearch:可以用来避免编写自己的 NLP 吗?(例如重新发明轮子)

问题描述

这是我要实现的目标的简化示例-我确信这是一个非常标准的事情,我希望有人可以指出我正确的模式、方法和方法,而无需重新发明轮子。

PUT /test/vendors/1
{
  "type": "clinic",
  "name": "ENT of Boston",
  "place": "Boston"  
}

PUT /test/vendors/2
{
  "type": "law firm",
  "name": "Ambulance Chasers Inc.",
  "place": "Boston"  

}

假设我想支持这样的搜索:

"Ambulance Chasers"
"Law Firm in Boston"

我可以像这样运行搜索:

GET /test/_search
{
  "query": {
    "multi_match" : {
      "query":    "Law Firm in Boston", 
      "fields": [ "type", "place", "name" ],
      "type": "most_fields"
    }
  }
}

他的问题是,这也会吸引我ENT Of Boston,因为它有Boston它的名字,尽管这显然不是我想要的。

我知道我可以编写自己的代码在将搜索字符串提交给 Elasticsearch 之前对其进行分析,并强制Boston仅在文档中的 place 字段中进行搜索。我可以对所有字段执行此操作,并针对用户需要的内容发出超级精确的搜索查询。但是有没有更简单的方法来处理我所缺少的东西?

我想我要问的是 Elasticseaarch 是否有一种方法可以让我微调和“理解”我正在寻找的内容,而不会强迫我在自己的代码中深入研究自然语言处理并重新发明轮子.

标签: elasticsearch

解决方案


Elasticsearch“搜索”纯粹基于关键字搜索。

然而,您得到的是一些NLP,例如检索或收集数据、提取所需信息、标记化、去除停用词(所有这些都由分析器完成)、相似性计算(使用 tf-idf 和向量空间模型)。

进一步的 NLP 过程包括提出一个模型、训练该模型、对文本数据进行分类等,我认为 Elasticsearch 没有可以做到这一点的引擎(有一个名为MLT(更多类似的)的实现,但我不知道它是如何工作的(还没读过))

如果您最终创建了一个 NLP 引擎,您可以做的是使用 elasticsearch 作为 NLP 引擎的源,同样,您不需要实现上述基本阶段。

您可以查看这个非常有趣的 博客。

无论如何,说了这么多,看看你的用例,我想出了下面的查询。我知道它不是确切的解决方案,但它会给出您正在寻找的结果。

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "law",
            "fields": [ "type", "place", "name"],
            "type": "most_fields"
          }
        },
        {
          "multi_match": {
            "query": "firm",
            "fields": [ "type", "place", "name"],
            "type": "most_fields"
          }
        },
        {
          "multi_match": {
            "query": "boston",
            "fields": [ "type", "place", "name"],
            "type": "most_fields"
          }
        }
      ]
    }
  }
} 

我所做的只是使用您发布的查询为每个单词创建了一个必须子句。这将向您保证,您最终不会得到您正在寻找的不需要的结果。

让我知道它是否有帮助!


推荐阅读