首页 > 解决方案 > Elasticsearch:从文档中检索长文本字段

问题描述

我有一个在 ES 中索引的文档。此文档有 3 个文本字段F1F2F3.

当我尝试使用 Java API 搜索此文档时,我只有 fieldsF1和的值F2,并且 fieldF3显示为空。

QueryBuilder query =  //Some query

SearchResponse response = client.prepareSearch(index)
                .addDocValueField("F1.keyword")
                .addDocValueField("F2.keyword")
                .addDocValueField("F3.keyword")
                .setQuery(query)
                .execute()
                .actionGet();

SearchHit hit = response.getHits().getAt(0);

System.out.println("F1 : "+hit.getField("F1.keyword").getValue());
System.out.println("F2 : "+hit.getField("F2.keyword").getValue());
System.out.println("F3 : "+hit.getField("F3.keyword").getValue()); // empty

我的领域F3可能很长。在我用于测试的文档中,它包含超过 300 个字符,并且可能更长。

我的索引映射是:

"mappings": {
      "MyIndex": {
        "properties": {
          "F1": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "F2": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "F3": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }

所以我将ignore_above映射中的字段更新F3为 20000(可能是个坏主意?),但我仍然有相同的行为。

有什么问题,正确的方法是什么?

备注:

编辑 :

奇怪的是,当我使用带有查询的浏览器请求 elasticsearch 时,我得到了预期的结果:

http://localhost:9200/MyIndex/_search?pretty=true?{"query": {"match_all": {}}}

标签: javaelasticsearch

解决方案


在 Elasticsearch 中,默认行为将文本字符串映射到两种不同的 Elasticsearch 类型:textkeyword. 它们是不同的东西,用于不同的目的,主要是它text是一个全文搜索字段,而keyword就像一个结构化的常量值。在文档中阅读更多内容

在您的情况下,该keyword字段的默认包含看起来没有帮助。在您的查询中,您应该只获取“常规”F3字段,和/或常规F1字段F2

最后,我对 ES Java 客户端不是很熟悉,但如果你想做源过滤(即只从你的请求中获取值的子集),我认为这addDocValueField()是不对的。查看:https ://www.elastic.co/guide/en/elasticsearch/client/java-rest/5.6/java-rest-high-search.html#_source_filtering


推荐阅读