当前位置: 首页 > 面试题库 >

使用Elastic search从文本中提取关键字(多词)

冯旭
2023-03-14
问题内容

我有一个充满关键字的索引,根据这些关键字,我想从输入文本中提取关键字。

以下是示例关键字索引。请注意,关键字也可以是多个单词,或者基本上是唯一的标签。

{
  "hits": {
    "total": 2000,
    "hits": [
      {
        "id": 1,
        "keyword": "thousand eyes"
      },
      {
        "id": 2,
        "keyword": "facebook"
      },
      {
        "id": 3,
        "keyword": "superdoc"
      },
      {
        "id": 4,
        "keyword": "quora"
      },
      {
        "id": 5,
        "keyword": "your story"
      },
      {
        "id": 6,
        "keyword": "Surgery"
      },
      {
        "id": 7,
        "keyword": "lending club"
      },
      {
        "id": 8,
        "keyword": "ad roll"
      },
      {
        "id": 9,
        "keyword": "the honest company"
      },
      {
        "id": 10,
        "keyword": "Draft kings"
      }
    ]
  }
}

现在,如果输入文本为 “我在Facebook上看到了借贷俱乐部的新闻,您的故事和法定人数” ,则搜索结果应为 [“借贷俱乐部”,“
facebook”,“您的故事”,“法定人数”]
。此外,搜索应 区分大小写


问题答案:

只有一种真正的方法可以做到这一点。您必须将您的数据作为关键字建立索引,并使用带状疱疹对其进行分析:

看到这个复制品:

首先,我们将创建两个自定义分析器:keyword和shingles:

PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer_keyword": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "asciifolding",
            "lowercase"
          ]
        },
        "my_analyzer_shingle": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "asciifolding",
            "lowercase",
            "shingle"
          ]
        }
      }
    }
  },
  "mappings": {
    "your_type": {
      "properties": {
        "keyword": {
          "type": "string",
          "index_analyzer": "my_analyzer_keyword",
          "search_analyzer": "my_analyzer_shingle"
        }
      }
    }
  }
}

现在,让我们使用您提供的数据创建一些示例数据:

POST /test/your_type/1
{
  "id": 1,
  "keyword": "thousand eyes"
}
POST /test/your_type/2
{
  "id": 2,
  "keyword": "facebook"
}
POST /test/your_type/3
{
  "id": 3,
  "keyword": "superdoc"
}
POST /test/your_type/4
{
  "id": 4,
  "keyword": "quora"
}
POST /test/your_type/5
{
  "id": 5,
  "keyword": "your story"
}
POST /test/your_type/6
{
  "id": 6,
  "keyword": "Surgery"
}
POST /test/your_type/7
{
  "id": 7,
  "keyword": "lending club"
}
POST /test/your_type/8
{
  "id": 8,
  "keyword": "ad roll"
}
POST /test/your_type/9
{
  "id": 9,
  "keyword": "the honest company"
}
POST /test/your_type/10
{
  "id": 10,
  "keyword": "Draft kings"
}

最后查询以运行搜索:

POST /test/your_type/_search
{
  "query": {
    "match": {
      "keyword": "I saw the news of lending club on facebook, your story and quora"
    }
  }
}

这是结果:

{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0.009332742,
    "hits": [
      {
        "_index": "test",
        "_type": "your_type",
        "_id": "2",
        "_score": 0.009332742,
        "_source": {
          "id": 2,
          "keyword": "facebook"
        }
      },
      {
        "_index": "test",
        "_type": "your_type",
        "_id": "7",
        "_score": 0.009332742,
        "_source": {
          "id": 7,
          "keyword": "lending club"
        }
      },
      {
        "_index": "test",
        "_type": "your_type",
        "_id": "4",
        "_score": 0.009207102,
        "_source": {
          "id": 4,
          "keyword": "quora"
        }
      },
      {
        "_index": "test",
        "_type": "your_type",
        "_id": "5",
        "_score": 0.0014755741,
        "_source": {
          "id": 5,
          "keyword": "your story"
        }
      }
    ]
  }
}

那么它在幕后做什么?

  1. 它将您的文档索引为整个关键字(它将整个字符串作为单个标记发出)。我还添加了asiifolding过滤器,因此它可以对字母进行规范化(即é成为e)和小写过滤器(不区分大小写的搜索)。因此例如Draft kings被索引为draft kings
  2. 现在,搜索分析器使用的是相同的逻辑,除了它的令牌生成器发出单词令牌,并在其之上创建带状疱疹(令牌的组合)之外,它将匹配第一步中索引的关键字。


 类似资料:
  • 问题内容: 我正在寻找Java库以从文本块中提取关键字。 该过程应如下所示: 停止单词清洗->词干->根据英语语言统计信息搜索关键字-意味着单词在单词中出现的次数比在英语中出现的次数多于候选单词。 是否有执行此任务的库? 问题答案: 这是使用ApacheLucene的可能解决方案。我没有使用最新版本,但使用3.6.2版本,因为这是我所知道的最好的版本。除了之外,别忘了将下载的存档中的添加到您的项目

  • 问题内容: 我必须从关键字后的SQL字段中的文本中提取内容。例如,如果我在表中有一个名为description的字段,并且该字段的表内容为: asdasf关键字狗 aeee关键字cat ffffaa关键字狼 我想提取并保存“关键字”之后的文本(在本例中为“狗,猫和狼”),然后将其保存在视图中,或者简单地通过选择显示它。谢谢你。 问题答案: 这是一个使用示例: 另一个例子: 结果: 请注意,此字符串

  • 问题内容: 有人可以举例说明在ElasticSearch中关键字和文本之间的区别吗? 问题答案: 关键字 类型:如果您将一个字段定义为像这样的关键字类型。 然后,当您对该字段进行搜索查询时,您必须插入整个值(关键字搜索),即关键字字段。 当您执行这样的搜索时: 它将不匹配任何文档。您必须搜索整个词“洗衣机”。 *另一方面,将分析 *文本 类型,您可以使用字段值中的标记进行搜索。 全文搜索 : 和搜

  • 我有一个如下所示的XML,正在尝试基于关键字提取节点。尝试使用XPath和XMLLint。但很明显,我做得不对。希望能在这方面有所帮助。 XML文件 给定此XML和关键字任务目标(不区分大小写),我需要提取整个节点并写入另一个XML文件 我尝试使用Xpath和XMllint进行提取。 有谁能告诉我上面的问题是什么,我如何解决?此外,我想在文件目录的shell中执行此操作。XMLlint是最佳选择吗

  • 问题内容: 我想使用Python从HTML文件中提取文本。如果要从浏览器复制文本并将其粘贴到记事本中,我希望得到的输出基本上相同。 我想要比使用正则表达式更强大的功能,而正则表达式可能在格式不正确的HTML上失败。我见过很多人推荐美丽汤,但是使用它时遇到了一些问题。例如,它拾取了不需要的文本,例如JavaScript源。此外,它没有解释HTML实体。例如,我希望' 在HTML源代码中转换为

  • 本文向大家介绍PHP函数实现从一个文本字符串中提取关键字的方法,包括了PHP函数实现从一个文本字符串中提取关键字的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP函数实现从一个文本字符串中提取关键字的方法。分享给大家供大家参考。具体分析如下: 这是一个函数定位接收一个字符串作为参数(连同其他配置可选参数),并且定位该字符串中的所有关键字(出现最多的词),返回一个数组或一个字符串由