Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Elasticsearch:从文档中检索长文本字段_Java_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java Elasticsearch:从文档中检索长文本字段

Java Elasticsearch:从文档中检索长文本字段,java,elasticsearch,Java,elasticsearch,我有一个用ES索引的文档。此文档有3个文本字段F1、F2和F3 当我尝试使用Java API搜索此文档时,我只有字段F1和F2的值,字段F3显示为空 QueryBuilder query = //Some query SearchResponse response = client.prepareSearch(index) .addDocValueField("F1.keyword") .addDocValueField("F2

我有一个用ES索引的文档。此文档有3个文本字段
F1
F2
F3

当我尝试使用Java API搜索此文档时,我只有字段
F1
F2
的值,字段
F3
显示为空

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
              }
            }
          }
        }
      }
    }
因此,我将映射中的
F3
上方的
ignore\u字段更新到20000(可能是个坏主意?),但我仍然有相同的行为

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

注:

  • 使用ES 5.6.3
  • 我不需要对字段
    F3
    进行任何分析/术语搜索,只在查询匹配
    F1
    F2
    时检索它的值
  • 我将有少量此类文件,因此效率不是大问题
编辑:

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

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

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

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


最后,我不太熟悉ES Java客户机,但是如果您想进行源代码筛选(即从请求中只获取一部分值),我认为
addDocValueField()
是不对的。签出:

它可以使用
setFetchSource()
代替
addDocValueField()
并且不使用
关键字。非常感谢。