问题标签 [elasticsearch-5]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
elasticsearch - 面向单词的补全建议器 (ElasticSearch 5.x)
ElasticSearch 5.x 对 Suggester API(文档)进行了一些(重大)更改。最显着的变化如下:
完成建议是面向文档的
建议知道它们所属的文档。现在,关联文档 (
_source
) 作为完成建议的一部分返回。
简而言之,所有完成查询都返回所有匹配的文档,而不仅仅是匹配的单词。这就是问题所在 - 如果自动完成的单词出现在多个文档中,则会出现重复。
假设我们有这个简单的映射:
附上几份测试文件:
以及按书查询:
这会产生以下结果:
简而言之,对于文本“joh”的完成建议,返回了两 (2) 个文档- John 的文档和两者都具有相同的text
属性值。
但是,我想收到一 (1) 个字。像这样简单的东西:
问题:如何实现基于单词的完成建议。无需返回任何与文档相关的数据,因为此时我不需要它。
“完成建议”是否适合我的场景?还是我应该使用完全不同的方法?
编辑:正如你们中的许多人指出的那样,额外的仅完成索引将是一个可行的解决方案。但是,我可以看到这种方法存在多个问题:
- 保持新索引同步。
- 自动完成后续单词可能是全局的,而不是缩小范围。例如,假设您在附加索引中有以下单词:
"John", "Doe", "David", "Smith"
. 查询时"John D"
,不完整单词的结果应该是"Doe"
而不是"Doe", "David"
。
为了克服第二点,仅索引单个单词是不够的,因为您还需要将所有单词映射到文档,以便正确缩小自动完成后续单词的范围。有了这个,你实际上和查询原始索引有同样的问题。因此,附加索引不再有意义。
java - 如何将地图转换为 SearchSourceBuilder?
在 Elasticsearch 2.x 中,我们source(Map)
用来初始化 aSearchRequest
的源:
在 Elasticsearch 5 中,所有source(...)
方法都消失了,取而代之的是一个 take SearchSourceBuilder
。记录了这么多。
但是我到底如何将 a 转换Map
为 a SearchSourceBuilder
?那里似乎没有任何有用的工厂方法,我已经搜索了其他方法Map
,似乎没有任何东西跳出来。
elasticsearch - 弹性搜索如何添加新字段并从现有字段中输入值
我有一个弹性搜索索引如下,
我需要添加另外三个字段(年、月、日)。并且需要从现有字段(created_date)中分配值。created_date 的格式是2016-11-22T22:20:21.000Z。我怎样才能做到这一点 ?弹性搜索版本是 5.0。
java - 如何从 Java 应用程序中运行 elasticsearch 5.1 服务器(而不是通过命令行)
在 elasticsearch 1.x 中,我曾经调用:
但是在 5.x 中,他们将类 org.elasticsearch.bootstrap.Elasticsearch 包私有(默认),所以我不能再以简洁的方式从 java 代码运行 ES 服务器了。是否有任何替代的简洁方法(不同于 Runtime exec 或 Apache Commons Exec)?
谢谢!
elasticsearch - Elasticsearch Index-per-Type 以避免重新索引所有数据
我目前正在使用 Elasticsearch 5,并使用大约需要一天时间来索引每种类型的数据集。大约有10种。
每种类型的映射可能会发生变化。在 Elasticsearch 2 中,需要删除类型并重新索引。但是在 Elasticsearch 5 中,有必要删除并重新索引整个索引。
每当映射发生变化时,我可以花一天时间重新索引,但不是 10 天。
我能看到的唯一方法是为每种类型设置一个单独的索引。这是一种可接受的方法,还是可能存在潜在问题?
elasticsearch - 如何安全地将 Elasticsearch 索引移动到 Linux 中的另一个挂载位置?
我现在有许多索引实际上在我的Ubuntu机器上造成了一些空间问题。指数每天都在增长。
所以我想把它移到另一个显然有更多空间的挂载目录。我怎样才能安全地做到这一点?
而且我必须确保现有的 ES指数和Kibana
图表在移动后足够安全。
我做了什么:按照这个SO并以某种方式将我的数据目录移动到我需要Elasticsearch
的目录(/data/es_data),但是在我这样做之后,我无法查看我现有的索引以及我创建的Kibana
图表和仪表板.
难道我做错了什么?任何帮助都将不胜感激。
nest - ElasticSearch Nest 5.0.1 throwing below exception, when called from Droid project, From Unit test everything works fine
I am working on Xamarin Android using Nest 5.0.1 in NetStandard project.
Search api are called from a portable project.
When calling any Nest Search api via Unit test. It is working fine. But when the same api via Droid project getting below error.
Can anyone help, what is missing. I have ensured that System.Net.Http is present in both Portable and Droid project.
elasticsearch - 电子邮件收件人的理想映射关系?
我正在尝试创建一个 ElasticSearch 映射来索引电子邮件。我已经阅读了关于映射关系的 ES 文档。但是我对用什么来代表收件人感到困惑?
ES 文档只在真正需要并且所有其他选项都用尽时才使用父子关系强烈警告。特别是它说在有几个父母有很多孩子的情况下使用父子关系。
大多数电子邮件的收件人很少(少于 50 个),所以我的第一反应是使用“嵌套对象”。然而,偶尔会有那些..“全手”电子邮件,收件人可能会增加多达数千个收件人。
所以我的困境是 - 我的一般情况似乎非常适合嵌套对象,但我的边缘情况似乎非常适合父子关系。因此,如果有 ElasticSearch 用户经历过这种情况,我很想知道您为此使用了什么映射关系以及原因。
===更多详情===
我不会更新太多,只是索引搜索。
每个条目代表一封电子邮件
每封电子邮件都包含收件人
我希望能够通过搜索收件人来检索电子邮件。
每个收件人都有 displayName 和 emailAddress,我希望这种关系完好无损。
例如:
在上面的示例中,如果我要搜索收件人姓名包含“John”和“Doe”的电子邮件,那么上面的电子邮件将不匹配。
所以马上,我觉得嵌套对象是正确的方案。然而,有时我会收到一封“全员”会议电子邮件,该电子邮件实际上是发送给公司中的每个人(数以万计的收件人)。
默认情况下,字段的限制是 1000,这就是为什么我担心嵌套对象可能无法处理这个问题。
这是嵌套对象 index.mapping.total_fields.limit 的默认限制的链接 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html#mapping-limit-settings
elasticsearch-5 - 从 ES 2.x 迁移到 ES 5.x Elasticsearch
我们创建了新的 ES 集群 v5.x。我们添加了用于恢复的新备份存储库(旧 ES 2.x)。我们已经从快照中恢复,一切都很好。我们的 ES 快照有保留期。我们正在使用 s3 存储和 repository-s3 插件进行备份。虽然我们的保留期已删除此快照,但我们收到了一个错误:
完整日志:
我已尝试删除此快照存储库,删除所有索引。但是如果我再次添加这个存储库,我会得到同样的错误。如何恢复 ES?ES 在哪里获取有关旧快照的信息?
此致。
java - 带有多个术语的模糊通配符搜索:将所有数据放入一个属性中?
我目前正在将 Elasticsearch 作为搜索接口嵌入到现有应用程序中。该应用程序是带有 oracle SQL 数据库的经典 3 层应用程序。
我有实体“人”(数据库表),具有以下属性:
- 名
- 姓
- 全名(包含连接的名字和姓氏)
- 人号
- 公司名称
- 地址列表:街道、邮政编码、城市、电话和电子邮件。
到目前为止,我将它 1:1 放入 elasticsearch,每个 db-column 在 elasticsearch 中都有一个属性。数据的同步和满载是没有问题的。但我正在努力提供“良好”的搜索体验,因为有许多不同的事情需要注意:
- 模糊搜索(允许一两个编辑距离)
- 通配符搜索(如果我输入“Ange”,它也应该找到带有“Angelina”的结果)
- 电子邮件地址搜索(我已经将
uax_url_email
标记器与keyword
数据类型结合使用)
据我所知,multi_match
typecross_fields
是一个不错的选择,但它不能进行模糊搜索和通配符。typebest_fields
也不是选项,因为它不能进行通配符搜索(据我所知?)。most_fields
也不适合,phrase matching
不能做模糊。
因此,我目前正在使用simple_query_string
,例如:
在搜索字段中,我输入Tom fisher
: 中的查询simple_query_string
是:
我现在的问题是,只在字段“entity_content”上包含所有字段的内容是不是一个坏主意?这就像我有一个包含有关此人的所有信息的 .txt 文档。
- 有什么优点/缺点?