参考官方文档中提到的建立亲子关系的例子——https: //www.elastic.co/guide/en/elasticsearch/reference/current/parent-join.html
该链接提供了问答连接关系,其中问题是父类型,答案是子类型。
如果您需要在一个查询中搜索匹配某些文本的所有父母以及他们的孩子匹配某些特定于孩子的文本,您会怎么做?
假设他们在 json 文档中有键值对,如下所示,我们搜索与问题中的文本匹配的父项和与 answer-text 中的值匹配的子项。
Parent --> question --> "question-text" : "Geography: Where is Mt. Everest?"
Child --> answer --> "answer-text" : "Nepal?"
Run Code Online (Sandbox Code Playgroud)
我们不希望结果中只包含父项或子项,而是所有父项及其与查询匹配的关联子项。
我知道内部命中是一种选择,但无法弄清楚用法 - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html
我希望问题很清楚,如果需要可以添加更多细节。
我还尝试了此处提到的父子内部命中示例:
例子:
POST test_index/_search
{
"query": {
"has_child": {
"type": "child",
"query": {
"match": {
"number": 2
}
},
"inner_hits": {}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我所有父母的匹配孩子。如何向父级添加过滤器并仅查询同一查询中的特定父级(以及子级过滤器)?是否可以在同一查询中的特定字段上过滤父记录?
像这样的东西——
POST test_index/_search
{
"query": {
<match parents first on number:1 and then match the children below>
"has_child": {
"type": "child",
"query": { …Run Code Online (Sandbox Code Playgroud) 我正在使用 npm elasticsearch 包来搜索我的 AWS ES 域。当我使用 Postman 使用我的 AWS IAM 凭证发出 POST 请求时,一切似乎都正常。我想在我的代码(node.js)中做同样的事情。我在这里提到了这个答案: How to make call to elasticsearch apis through NodeJS?
这是代码:
const elasticsearch = require('elasticsearch');
const awsHttpClient = require('http-aws-es');
const AWS = require('aws-sdk');
const client = new elasticsearch.Client({
host: 'my-aws-es-endpoint',
connectionClass: awsHttpClient,
amazonES: {
region: 'us-east-1',
credentials: new AWS.Credentials('my-access-key','my-secret-key')
}
});
Run Code Online (Sandbox Code Playgroud)
但是当我运行 client.search() 时,它失败并出现错误:
Elasticsearch ERROR: 2018-10-31T15:12:22Z
Error: Request error, retrying
POST https://my-endpoint.us-east-1.es.amazonaws.com/my-index/student/_search => Data must be a string or a buffer
Run Code Online (Sandbox Code Playgroud)
它也给了我一个警告
Elasticsearch WARNING: 2018-10-31T15:12:22Z
Unable …Run Code Online (Sandbox Code Playgroud) amazon-web-services node.js elasticsearch aws-sdk aws-elasticsearch
我在关键字字段上收到“默认情况下在文本字段上禁用 Fielddata”。下面是代码。
{
"aggs": {
"agg_terms_user": {
"terms": {
"field": "user"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
用户字段的映射如下
user: { type: "keyword" }
Run Code Online (Sandbox Code Playgroud)
由于用户字段的类型设置为关键字,我不应该收到错误消息。但是,错误仍然被抛出。
[illegal_argument_exception] 默认情况下,在文本字段上禁用字段数据。在 [user] 上设置 fielddata=true 以通过反转倒排索引将 fielddata 加载到内存中。请注意,这可能会占用大量内存。或者改用关键字字段。
我现在不知道该尝试什么。
在非 AWS 托管的 ElasticSearch 中,您可以将http.max_content_length configuration批量发送数据到要建立索引的节点时的值增大到大于默认 100MB 的值。
这将在文件中完成elasticsearch.yml。
在 Amazon OpenSearch 中,您似乎没有修改opensearch.yml(?) 的选项,那么当您遇到此问题时如何进行类似的更改?
是否可以增加 Amazon OpenSearch 中默认的 100MB 限制?
我正在学习 ElasticSearch(托管在 AWS 上)。我正在使用javascript sdk和这个 connectionClass。
我的代码:
let es = require('elasticsearch');
let client = new es.Client({
hosts: ['https://search-nboardelastic-xxyy.foo.es.amazonaws.com'],
connectionClass: require('http-aws-es')
});
function handler() {
let params = {
index: 'product',
q: 'bar'
};
client.search(params, (err, data) => {
if (err) {
console.log('Error ', err);
} else {
console.log('Data ', data);
}
})
}
handler();
Run Code Online (Sandbox Code Playgroud)
问题:当我运行代码时,出现以下错误:
Error: Request error, retrying
POST https://https://search-nboardelasticxxyy.foo.es.amazonaws.com/product/_search => The "data" argument must be one of type string, TypedArray, or DataView
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试将数据从 DynamoDB 流式传输到 ElasticSearch。我已经在线查看了 AWS + 其他一些来源的文档,但遇到了安全问题。所以我使用的是 lambda 函数,从 DynamoDB 检索数据的过程很好,但是当我尝试写回 ElasticSearch 时,我收到一个错误:
“ [indices:data/write/bulk] 和用户 [name=arn:aws:iam::account number:role/dynamodb_to_es, backend_roles=[arn:aws:iam::account number:role/dynamodb_to_es] 没有权限,请求租户=空]"
这是我的 Lambda 函数。我意识到它总是会因为“_bulk”扩展名而失败。谢谢!!
我的 Lambda 函数:https : //github.com/YassineRjl/Lambda-Func---DynamoDB-to-ElasticSearch/blob/master/lambda_func.py
如何更改映射或我的输入以解决这些错误,在 AWS 上使用 elasticsearch,
映射:
{
"index_patterns": ["*-students-log"],
"mappings": {
"properties": {
"Data": {
"type": "object",
"properties": {
"PASSED": {
"type": "object"
}
}
},
"insertion_timestamp": {
"type": "date",
"format": "epoch_second"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的数据:
curl -XPOST -H 'Content-Type: application/json' https://******.us-east-1.es.amazonaws.com/index_name/_doc/1 -d '{"Data": {"PASSED": ["Vivek"]},"insertion_timestamp": 1591962493}'
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
{"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"object mapping for [Data.PASSED] tried to parse field [null] as object, but found a concrete value"}],"type":"mapper_parsing_exception","reason":"object mapping for [Data.PASSED] tried to parse field [null] as object, but found a concrete value"},"status":400}
Run Code Online (Sandbox Code Playgroud)
上述数据中缺少或错误的部分是什么?我应该为字符串数组使用任何其他数据类型吗?任何帮助,将不胜感激...
amazon-web-services elasticsearch elasticsearch-mapping aws-elasticsearch
我已经创建了 AWS elasticsearch 域
https://search-xx-xx.us-east-1.es.amazonaws.com/
单击下面的弹性 url 和 kibana 是我得到的错误
{"Message":"用户:匿名无权执行:es:ESHttpGet"}
下面是工作正常的代码
import boto3
from requests_aws4auth import AWS4Auth
from elasticsearch import Elasticsearch, RequestsHttpConnection
session = boto3.session.Session()
credentials = session.get_credentials()
awsauth = AWS4Auth(credentials.access_key,
credentials.secret_key,
session.region_name, 'es',
session_token=credentials.token)
es = Elasticsearch(
['https://search-testelastic-2276kyz2u4l3basec63onfq73a.us-east-1.es.amazonaws.com'],
http_auth=awsauth,
use_ssl=True,
verify_certs=True,
connection_class=RequestsHttpConnection
)
def lambda_handler(event, context):
es.cluster.health()
es.indices.create(index='my-index', ignore=400)
r = [{'Name': 'Dr. Christopher DeSimone', 'Specialised and Location': 'Health'},
{'Name': 'Dr. Tajwar Aamir (Aamir)', 'Specialised and Location': 'Health'},
{'Name': 'Dr. Bernard M. Aaron', 'Specialised and Location': 'Health'},
{'Name': …Run Code Online (Sandbox Code Playgroud) 我第一次尝试配置我的 logstash.conf 文件并输出到 amazon_es。
我的整个logstash.conf文件在这里:
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://localhost:3306/testdb"
# The user we wish to execute our statement as
jdbc_user => "root"
jdbc_password => "root"
# The path to our downloaded jdbc driver
jdbc_driver_library => "/mnt/c/Users/xxxxxxxx/mysql-connector-java-5.1.45/mysql-connector-java-5.1.45-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
# our query
statement => "SELECT * FROM testtable"
}
}
output {
amazon_es {
hosts => ["search-xxxxx.eu-west-3.es.amazonaws.com"]
region => "eu-west-3"
aws_access_key_id => 'xxxxxxxxxxxxxxxxxxxxxx'
aws_secret_access_key => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
index => "test-migrate"
document_type => "data"
}
}
Run Code Online (Sandbox Code Playgroud)
我从我的数据库中选择了 …
amazon-web-services elasticsearch logstash aws-elasticsearch
我正在尝试通过 AWS ElasticSearchService Monitor Alert Trigger 在 Slack 上发布详细消息。我尝试使用描述中的变量 https://opendistro.github.io/for-elasticsearch-docs/docs/alerting/monitors/
警报被触发并发布在 Slack 上,但当我尝试在行动中使用它们时,大多数变量都是空的。我只从ctx.trigger.name, ctx.periodStart,获取信息ctx.periodEnd。像ctx.trigger.condition, ctx.results[0], ctx.error, 之类的变量ctx.results[0].hits.total是空的,而文档说ctx.error如果ctx.results[0]是空的,就会被填充。
如何获取更多数据?我的查询是否以某种方式限制了它?
我的监视器提取查询如下:
{
"size": 20,
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"range": {
"@timestamp": {
"from": "now-1m",
"to": null,
"include_lower": true,
"include_upper": true,
"boost": 1
}
}
}
],
"must_not": [
{
"match": {
"status": {
"query": "200",
"operator": "OR",
"prefix_length": 0,
"max_expansions": …Run Code Online (Sandbox Code Playgroud)