我使用的是spring data elasticsearch,当我使用@query注释时,将代码与实际的JSON elasticsearch查询关联起来要容易得多,如本链接参考中的示例所示:
https://www.programcreek.com/java-api-examples/index.php?api=org.springframework.data.elasticsearch.annotations.Query
我想知道是否有一种方法可以通过elasticsearch java库进行完整的JSON主体查询,而无需注释。即在方法实现或其他东西中。这将帮助我解析响应中的高亮显示,等等。
谢谢你提供的任何信息。
来自评论的澄清:我使用的是sping-data-elasticsearch 3.0.10。释放与弹性搜索6.由于sping-data-elasticsearch似乎还不支持RestHighLevelClient,我正在使用TransportClient客户端=new PreBuiltTransportClient(elasticsearch chSet);创建Elasticsearch chTem板时的方法:返回新的Elasticsearch chTem板(客户端());
这里有另一种方法,但不使用传输客户端。
将这些依赖项添加到您的pom中。xml
:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
<scope>compile</scope>
</dependency>
然后这样做:
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
Client client = new Client();
final WebResource r = client.resource("http://localhost:9200").path("/myindex/_search");
String requestJson = "{\"query\" : {\"match\" : {\"type\" : \"book\"} }}";
ClientResponse response = r.post(ClientResponse.class, requestJson);
String json = response.getEntity(String.class);
Gson gson = new GsonBuilder().setPrettyPrinting()
.create();
Map map = gson.fromJson(json, Map.class);
System.out.println(gson.toJson(map));
// to convert to SearchResponse:
JsonXContentParser xContentParser = new JsonXContentParser(NamedXContentRegistry.EMPTY,
new JsonFactory().createParser(json));
SearchResponse searchResponse = SearchResponse.fromXContent(xContentParser);
输出示例:
{
"took": 9.0,
"timed_out": false,
"_shards": {
"total": 5.0,
"successful": 5.0,
"failed": 0.0
},
"hits": {
"total": 1.0,
"max_score": 0.2876821,
"hits": [
{
"_index": "myindex",
"_type": "mydoc",
"_id": "AWXp8gZjXyu6lA_2Kpi2",
"_score": 0.2876821,
"_source": {
"title": "foobar",
"type": "book"
}
}
]
}
}
我想出了一种方法,但它需要你制作一个生活在弹性节点上的脚本。请参阅基于文件的脚本。它不是非常灵活,但可以试一试。下面是要做的。
创建一个名为template_doctype.mustache
的文件,并将其复制到$ELASTIC_HOME/config/脚本
。这是您可以根据需要定制的脚本。重启弹性或等待60秒重新加载。
{
"query" : {
"match" : {
"type" : "{{param_type}}"
}
}
}
我的pom.xml
依赖关系:
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
<scope>compile</scope>
</dependency>
</dependencies>
(仅供参考,我使用mvn dependency:tree
发现您的spring data elasticsearch
版本隐式使用了elasticsearch库的5.5版本,即使您使用的是elasticsearch 6。)
创建虚拟索引:
curl -X PUT http://localhost:9200/myindex
创建两个可用于匹配的文档,以确保代码正常工作:
curl -X POST http://localhost:9200/myindex/mydoc -d '{"title":"foobar", "type":"book"}'
curl -X POST http://localhost:9200/myindex/mydoc -d '{"title":"fun", "type":"magazine"}'
试着运行一个查询。此代码应返回单个文档:
String clusterName = "my-application";
Settings elasticsearchSettings = Settings.builder().put("cluster.name", clusterName).build();
TransportClient client = new PreBuiltTransportClient(elasticsearchSettings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"),9300));
Map<String, Object> template_params = new HashMap<>();
// Here is where you put parameters to your script.
template_params.put("param_type", "book");
SearchResponse sr = new SearchTemplateRequestBuilder(client)
.setScript("template_doctype") // this is where you specify what template to use
.setScriptType(ScriptType.FILE)
.setScriptParams(template_params)
.setRequest(new SearchRequest())
.get()
.getResponse();
SearchHit[] results = sr.getHits().getHits();
for(SearchHit hit : results){
String sourceAsString = hit.getSourceAsString();
if (sourceAsString != null) {
Gson gson = new GsonBuilder().setPrettyPrinting()
.create();
Map map = gson.fromJson(sourceAsString, Map.class);
System.out.println( gson.toJson(map));
}
}
输出:
{
"title": "foobar",
"type": "book"
}
我正在开发JSF项目并将Elastic Search与本机JavaApi(不是Jest)一起使用。我在elasticsearch索引映射中为高级全文搜索定义了分析器和nGram过滤器。如何使用java api进行此查询定义?
我对弹性搜索完全陌生。我在试着从弹性搜索中取记录。 我查了文件,但找不到任何解决办法。如果你在这里给我一些提示或一些网站,我可以解决我的问题,我将非常感谢。
我做了一个elasticsearch查询,以按县查找成员页面。 总体目标是获取查询返回的所有memberId,并将它们用作另一个查询的搜索条件。(实体“成员”有一个名为“memberId”的字段) 我尝试使用. getContent获取页面内容(以便从页面获取memberId字段)... 但是我不知道我到底在用. Collection做什么,它返回的不仅仅是memberId 下面是sysout中显
升级到Spring boot 2.3和Spring data elasticsearch 4.0.9后的问题。我有这样的文档: 这在spring data 3.0中与Jackson配合得很好,但升级到4.0后,Jackson不再可用,现在我收到了一个来自spring的实例化异常,无法实例化URL对象。 例外情况: 任何关于解决方案的想法都将受到赞赏。
我们正在开发一个应用程序,在这个应用程序中,我们从不同的源和不同的格式接收json格式的数据,用户也可以将这些源添加到自己的那里,所以我们不知道json格式会有什么属性 我们的应用程序将该数据表示为网格格式,网格提供了对该数据的过滤、排序、分页、分组等标准操作。 我们决定使用弹性搜索来存储如此大的、非结构化的数据。在后端,我们使用。NET(C#)。 开始使用大容量API对数据进行索引。下面是示例j
我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢