java - ElasticSearch Java API 查询生成器

标签 java elasticsearch query-builder elasticsearch-java-api

我尝试使用定义的参数在 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("*********************************************");
    }

执行:

execution result image

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”)的结果:

localhost:9200/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,即 analyzedkey.keyword 字段是精确匹配(术语查询)的字段。因此,如果您搜索 key.keyword 字段,您将获得您期望的结果,更好的是,创建索引并根据需要定义映射,并且不要让 elasticsearch 做出任何假设.

关于java - ElasticSearch Java API 查询生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48628471/

相关文章:

elasticsearch - elasticsearch_dsl TypeError:index()缺少1个必需的位置参数: 'doc_type'

mysql - 是否可以在 Laravel 5.8 中使用 Eloquent 或查询生成器批量插入忽略/插入或更新?不循环每条记录?

database - 具有不同数据库的 Laravel 4 Query Builder

java - 如何在 adobe indesign 中创建我们自己的插件

java - 基于正则表达式java查找并替换整行

elasticsearch - 无法以毫秒正确排序日期

elasticsearch - 简单的Elasticsearch正则表达式

java - 从非 Activity 状态启动对话框

java - JAX-WS Web 服务中 BindingProvider 的用途

php - 在 codeigniter 中如何删除字符串中不需要的字符或符号