elasticsearch - 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“搜索”纯粹基于关键字搜索。
然而,您得到的是一些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"
}
}
]
}
}
}
我所做的只是使用您发布的查询为每个单词创建了一个必须子句。这将向您保证,您最终不会得到您正在寻找的不需要的结果。
让我知道它是否有帮助!
推荐阅读
- html - 如何使用 CSS 网格制作垄断板?
- stream - 使用度量的 Flink 事件计数
- apache-spark - 火花中是否有一个功能可以跳过左连接,以防不需要左连接添加的字段
- python - “收到无效的 JSON 有效负载。在 Python 中使用 Google Sheet APIv4 batchUpdate() 时,‘data[0]’处的未知名称“范围””
- python - Selenium Python:浏览器无法加载动态加载的数据
- android - 如何在 Recyclerview 中的两个卡片视图之间留出空间
- javascript - 从 forEach 循环中单击的按钮获取索引值并将该值传递给 app.js
- python - 如何在python的列表中找到平均值、最大值和最大值(类似于excel函数)?
- python - 使用 pip install wfdb 安装后无法导入“wfdb”模块
- c++ - 非内联命名空间不能作为内联重新打开