我想检查elasticsearch中是否存在具有特定字段值的文档。
我浏览了互联网,但只找到了如何检查字段是否存在的方法。
我的索引/类型是
/twitter/user
Run Code Online (Sandbox Code Playgroud)
用户名是文档中的一个字段。
我想检查username="xyz"此类型中是否存在。
我刚刚开始在我的项目中使用 Elasticsearch,我想像 sql 关键字“like%”一样进行搜索。
谁能解释一下Wildcard、Prefix、query_string和Regexp之间的区别吗?
哪一个搜索性能最好?
这是通过定义关键字字段在产品标签之间快速搜索并使用我提到的三种方式之一进行搜索的最佳方法吗?
我很感激回答我的人。
谢谢。
在 postgres 数据库中,我有一个唯一约束和为其创建的两个唯一索引。我使用以下查询删除了约束:
alter table my_schema.users drop constraint users_dept_uk
Run Code Online (Sandbox Code Playgroud)
它已删除约束和一个索引,但第二个索引仍然存在。
以下查询仍然告诉我索引存在:
SELECT r.relname, r.relkind, n.nspname
FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid
WHERE r.relname = 'users_dept_idx';
Run Code Online (Sandbox Code Playgroud)
它给出以下输出:
users_dept_idx, i, my_schema
Run Code Online (Sandbox Code Playgroud)
当我执行下面的查询时:
drop index my_schema.users_dept_idx
Run Code Online (Sandbox Code Playgroud)
我收到错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedObject) index "users_dept_idx" does not exist
Run Code Online (Sandbox Code Playgroud)
我在这里缺少什么?由于我不再需要这个索引,无法删除它也无法插入数据。
我试图找出在我的集群节点上配置内存的最佳方法.但是我相信,为此,我需要进一步了解一些事情,例如spark如何处理任务中的内存.
例如,假设我有3个执行程序,每个执行程序可以并行运行多达8个任务(即8个核心).如果我有一个带有24个分区的RDD,这意味着理论上所有分区都可以并行处理.但是,如果我们在此处放大一个执行程序,则假定每个任务都可以将其分区放在内存中以对其进行操作.如果不是那么这意味着不会发生并行的8个任务,并且需要一些调度.
因此,我得出结论,如果一个人寻求真正的并行性,对分区大小有所了解会有所帮助,因为它会告诉您如何确定执行者的大小以实现真正的并行性.
Q0 - 我只想更好地理解,当一个执行器中并非所有分区都能适合内存时会发生什么?有些是在磁盘上溢出而有些是在内存中进行操作吗?spark会
为每个任务保留内存吗?如果它检测到没有足够的内存,它会安排任务吗?或者只是在
内存不足错误中运行.
Q1 - 执行程序中的真正并行性是否还取决于执行程序上可用的内存量?换句话说,我的群集中可能有8个核心,但如果我没有足够的内存来同时加载8个数据分区,那么我将不会完全并行.
作为最后一点,我已经多次看到以下声明,但发现它有点令人困惑:
"增加分区数量也有助于减少内存不足错误,因为这意味着Spark将为每个执行程序在较小的数据子集上运行."
这是如何工作的?我的意思是spark可以在较小的子集上工作,但如果总分区集合无论如何都不适合内存,会发生什么?
根据经验,使用 ES 进行分页的最佳方法是什么?目前,我正在开发一个后端使用 Elastic(通过 python)的 API,我的索引没有太多数据,所以默认情况下我们在 JavaScript(前端)中进行分页,我们没有问题。我想知道对于更大的索引,使用 Scroll API、切片或 search_after 进行分页的最佳方法是什么。
我是“弹性搜索”的新手,目前正在尝试了解 ES 如何维持“父子”关系。我从以下文章开始:
https://www.elastic.co/blog/managing-relations-inside-elasticsearch
但是这篇文章基于旧版本的 ES,我目前使用的是 ES 7.5,其中指出:
_parent 字段已被移除,取而代之的是 join 字段。
现在我正在关注这篇文章:
https://www.elastic.co/guide/en/elasticsearch/reference/7.5/parent-join.html
但是,我无法获得所需的结果。
我有一个场景,其中我有两个索引“人”和“家”。每个“人”可以有多个“家”,这基本上是一对多的关系。问题是当我查询获取所有父母为“XYZ”人的房屋时,答案为空。
以下是我的索引结构和搜索查询:
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"person_home": {
"type": "join",
"relations": {
"person": "home"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请求地址:http://hostname/home
{
"mappings": {
"properties": {
"state": {
"type": "text"
},
"person_home": {
"type": "join",
"relations": {
"person": "home"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请求网址:http://hostname/person/_doc/1
{
"name": "shujaat",
"person_home": …Run Code Online (Sandbox Code Playgroud) 我想在Elasticsearch中搜索用户名。为此,我想匹配确切的用户名,忽略其大小写,无论是大写还是小写,我只想找到该用户名。我为此使用以下查询:
QueryBuilder queryBuilder = QueryBuilders.termQuery("user_name.keyword", userName);
NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(queryBuilder).build();
List<Company> companies = elasticsearchTemplate.queryForList(build, User.class);
Run Code Online (Sandbox Code Playgroud)
但它也将单词与大小写精确匹配。例如:如果用户名是“Ram”并且我搜索“ram”,那么它不会返回该名称。如果我搜索“Ram”,那么它就会给我结果。但我希望它只匹配单词而不是单词的大小写。请有人帮我解决这个问题。我搜索了很多但找不到任何解决方案。
我正在尝试从 Spark 在 Elasticsearch 中编写对象集合。我必须满足两个要求:
_id应提供Elasticsearch文档这是我到目前为止所尝试的。
saveJsonToEs()我尝试saveJsonToEs()像这样使用(序列化文档包含_id具有所需 Elasticsearch ID 的字段):
val rdd: RDD[String] = job.map{ r => r.toJson() }
val cfg = Map(
("es.resource", "myindex/mytype"),
("es.mapping.id", "_id"),
("es.mapping.exclude", "_id")
)
EsSpark.saveJsonToEs(rdd, cfg)
Run Code Online (Sandbox Code Playgroud)
但elasticsearch-hadoop图书馆给出了这个例外:
Caused by: org.elasticsearch.hadoop.EsHadoopIllegalArgumentException: When writing data as JSON, the field exclusion feature is ignored. This is most likely not what the user intended. Bailing out...
at org.elasticsearch.hadoop.util.Assert.isTrue(Assert.java:60)
at org.elasticsearch.hadoop.rest.InitializationUtils.validateSettings(InitializationUtils.java:253)
Run Code Online (Sandbox Code Playgroud)
如果我删除es.mapping.exclude但保留es.mapping.id并发送带有内部的 JSON …
我需要找出一个标签与另一组固定标签作为整体之间的共现时间。我有 10000 个不同的单个标签,固定标签集中有 10k 个标签。我以固定的时间范围循环访问一组固定标签上下文下的所有单个标签。我的索引内总共有 10 亿个文档,有 20 个分片。
这是elasticsearch查询,elasticsearch 6.6.0:
es.search(index=index, size=0, body={
"query": {
"bool": {
"filter": [
{"range": {
"created_time": {
"gte": fixed_start_time,
"lte": fixed_end_time,
"format": "yyyy-MM-dd-HH"
}}},
{"term": {"tags": dynamic_single_tag}},
{"terms": {"tags": {
"index" : "fixed_set_tags_list",
"id" : 2,
"type" : "twitter",
"path" : "tag_list"
}}}
]
}
}, "aggs": {
"by_month": {
"date_histogram": {
"field": "created_time",
"interval": "month",
"min_doc_count": 0,
"extended_bounds": {
"min": two_month_start_time,
"max": start_month_start_time}
}}}
})
Run Code Online (Sandbox Code Playgroud)
我的问题:是否有任何解决方案可以在elasticsearch内部有一个缓存,用于固定的10k组标签术语查询和时间范围过滤器,从而可以加快查询时间?对于我上面的查询,单个标签花费了 1.5 秒。
我正在尝试使用一个例子
https://www.elastic.co/guide/en/elasticsearch/reference/6.4/modules-scripting-using.html
我创建了一个函数并保存了它。
POST http://localhost:9200/_scripts/calculate-score
{
"script": {
"lang": "painless",
"source": "ctx._source.added + params.my_modifier"
}
}
Run Code Online (Sandbox Code Playgroud)
尝试调用保存的函数
POST http://localhost:9200/users/user/_search
{
"query": {
"script": {
"script": {
"id": "calculate-score",
"params": {
"my_modifier": 2
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它返回一个错误:Variable [ctx] is not defined。我尝试使用doc['added']但收到相同的错误。请帮助我了解如何调用该函数。
apache-spark ×2
filter ×1
function ×1
lucene ×1
parent-child ×1
performance ×1
postgresql ×1
python ×1
query-cache ×1
scala ×1
spring-boot ×1
tags ×1