我尝试使用定义的参数在 ElasticSearch 中进行查询,但很多时候都不起作用。
有些参数值在包含某些字符(如大写字母这样简单)时将不再起作用。
例如,我有 3 个寄存器,键为 field1,值为 hello123、Hello123 和 HeLLo-123。
第一个有效,但其余的总是失败。
有人可以帮助我吗?
这是我的代码和以下执行:
logger.info("Testing queries");
TransportClient client = elasticSearchManager.getClient();
String[] values = {"hello123","Hello123","HeLLo-123"};
for (int i = 0; i < 3; i++) {
XContentBuilder jsonInsert = jsonBuilder().startObject();
jsonInsert.field("field1", values[i]);
jsonInsert.endObject();
IndexResponse responseDB = client.prepareIndex(index, "id").setSource(jsonInsert).get();
logger.info("response with value : "+values[i]+" => " + responseDB.getResult());
logger.info("*********************************************");
}
logger.info("VALUES INSERTED");
logger.info("***************");
logger.info("QUERIES");
for (int i = 0; i < 3; i++){
BoolQueryBuilder query = QueryBuilders.boolQuery()
.filter(QueryBuilders.termQuery("field1", values[i]));
SearchResponse response = client.prepareSearch(WIFI4EUOPConstants.indexSnippet).setQuery(query).get();
logger.info("field with value "+values[i]+" : ");
logger.info(response.toString());
logger.info("*********************************************");
}
执行:
P.D:我观察到第一个带有参数 hello123 的查询也返回了 Hello123 的结果,情况不应该是这样......
有人可以帮助我吗?
谢谢
P.D.2 更新
我尝试在索引中创建映射,然后插入数据,但它对我不起作用。我附上文件:
代码:
XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("properties")
.startObject("field1").field("type", "string").field("analyzer", "keyword").endObject()
.endObject().endObject();
client.admin().indices().prepareCreate(index).addMapping("id",mapping);
下图是加载index的url(称为“snippet”)的结果:
结果还是一样。
有人可以告诉我是我定义的映射错误还是我做错了?
谢谢
最佳答案
发生的情况是,您正在对数据建立索引,但没有创建索引并指定确切的 mapping你想要的。
Elasticsearch 将根据输入做出假设,并为您创建一个假设。例如,如果我们索引以下内容:
POST foo/bar/1
{
"key": "HeLLo-123"
}
我们可以看到elasticsearch创建了这个:
{
"foo": {
"aliases": {},
"mappings": {
"bar": {
"properties": {
"key": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
},
"settings": {
"index": {
"creation_date": "1517863731064",
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "iQzvEfU0Sli3c2LRC6gjyA",
"version": {
"created": "5030199"
},
"provided_name": "foo"
}
}
}
}
可以看到我索引的字段被指定为 multi-field 。您查询的内容被指定为 text
,即 analyzed 。 key.keyword
字段是精确匹配(术语查询)的字段。因此,如果您搜索 key.keyword
字段,您将获得您期望的结果,更好的是,创建索引并根据需要定义映射,并且不要让 elasticsearch 做出任何假设.
关于java - ElasticSearch Java API 查询生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48628471/