Spring 如何在JavaAPI中使用Analyzer和两个参数执行弹性搜索词查询
我是弹性搜索的新手,我正在将其与MongoDB集成以索引和搜索数据 所有这些都工作正常,我使用以下示例构建索引:Spring 如何在JavaAPI中使用Analyzer和两个参数执行弹性搜索词查询,spring,
elasticsearch,java,Spring,
elasticsearch,Java,我是弹性搜索的新手,我正在将其与MongoDB集成以索引和搜索数据 所有这些都工作正常,我使用以下示例构建索引: curl -XPUT localhost:9200/test/newperson/1 -d '{ "type": "mongodb", "mongodb": { "servers": [ { "host": "pc-4372", "port": 27017 } ], "db": "newPerson", "collectio
curl -XPUT localhost:9200/test/newperson/1 -d '{
"type": "mongodb",
"mongodb": {
"servers": [
{ "host": "pc-4372", "port": 27017 }
],
"db": "newPerson",
"collection": "Person",
"options": { "secondary_read_preference": true },
"gridfs": false
},
"index": {
"name": "mongoIndex",
"type": "Person"
}
}'
我目前正在构建一个web服务,它将使用JavaAPI来执行所需的搜索查询
MultiMatchQueryBuilder queryBuilder =
new MultiMatchQueryBuilder("foo", "fieldOne", "fieldTwo");
client.prepareSearch()
.setIndices(index)
.setQuery(queryBuilder)
.execute().actionGet();
我需要在构建的索引中搜索两个相同的值“termquery”。我知道,对于术语查询,我们需要使用分析器来分析文本,并能够检索相同的值
我尝试了几种方法来为某些字段建立索引和指定分析器,但我做不到。我也尝试过从JavaAPI级别来做这件事,它工作得很好,但是只有一个字段,我不能用两个字段来做这件事
SearchResponse r1 = client.prepareSearch("rootcause")
.setQuery(QueryBuilders.queryString("_id:" + rc.getRootCause_ID()).analyzer("snowball"))
.execute()
.actionGet();
我正在制作一个原型来诊断一些设备的故障
我想按设备型号和用户输入的症状进行搜索。我还尝试了以下代码:
SearchResponse response = client.prepareSearch("modelsymptom")
.setQuery(QueryBuilders.queryString("model_id: " + "MO-1" + " AND " + "symptom: RC-4").analyzer("snowball"))
.execute()
.actionGet();
从上述查询中检索到的结果包含RC-4或MO-1的所有文档以及其他不正确的文档。此查询应仅检索一个结果
使用指定的分析器构建索引,或者从JavaAPI级别进行构建,哪种方法更好
根据我的理解,我认为最好是使用索引构建analyzer,但我不知道到目前为止是如何实现的。您不需要任何特殊的analyzer,只需使用带有“必须”和两个术语的bool查询即可。“简单查询”的存在主要是为了手动测试查询,我不会在代码中使用它。另外,请始终首先尝试使用RESTAPI进行查询
{
“查询”:{
“布尔”:{
“必须”:[
{
“期限”:{
“型号”:“XXXX”,
}
},
{
“期限”:{
“症状”:“YYYY”
}
}
]
}
}
}
您不需要任何特殊的分析器,只需使用带有“必须”和两个术语的布尔查询即可。“简单查询”的存在主要是为了手动测试查询,我不会在代码中使用它。另外,请始终首先尝试使用RESTAPI进行查询
{
“查询”:{
“布尔”:{
“必须”:[
{
“期限”:{
“型号”:“XXXX”,
}
},
{
“期限”:{
“症状”:“YYYY”
}
}
]
}
}
}
我知道,对于术语查询,我们需要使用分析器来分析文本
并且能够检索相同的值
这是不对的
全文查询将在执行之前分析查询字符串,而术语级查询则对存储在倒排索引中的确切术语进行操作
查询全文字段时,请改用匹配查询,它可以了解字段的分析方式
否则,您将遇到此处描述的问题:
使用指定的分析器构建索引或
它是从JavaAPI级别开始的吗
无论哪种方式,都取决于您的具体场景
如果需要,可以使用Java中的分析器创建索引
String analyser = "{...}";
CreateIndexRequestBuilder createIndexRequestBuilder =
client.admin().indices().prepareCreate("indexName");
createIndexRequestBuilder.setSettings(analyser);
createIndexRequestBuilder.execute().actionGet();
其中,您的分析仪类似于:
{
"analysis":
{
"analyzer":
{
"my_analiser":
{
"type": "english"
}
}
}
}
但是,您需要创建自己的自定义映射,并在其中指定分析器
如果未指定自己的映射,当Elasticsearch检测到文档中的新字符串字段时,它会自动将其配置为全文字符串字段,并使用标准分析器对其进行分析。这对您来说可能已经足够了,但通常情况下是不够的,您需要构建自己的映射。您也可以通过Java实现这一点
// Index (and mapping) do not exist
CreateIndexRequestBuilder createIndexRequestBuilder =
client.admin().indices().prepareCreate("indexName");
createIndexRequestBuilder.addMapping("typeName", mapping);
response = createIndexRequestBuilder.execute().actionGet();
// Index exists but not mapping
PutMappingRequestBuilder preparePutMappingBuilder =
client.admin().indices().preparePutMapping("indexName");
preparePutMappingBuilder.setSource(mapping).setType("typeName");
response = preparePutMappingBuilder.execute().actionGet();
如何使用Analyzer和两个
javaapi中的参数
可以使用类似布尔查询的复合查询组合两个术语查询:
- 参考:
- Java文档:
- 参考:
- Java文档:
MultiMatchQueryBuilder queryBuilder =
new MultiMatchQueryBuilder("foo", "fieldOne", "fieldTwo");
client.prepareSearch()
.setIndices(index)
.setQuery(queryBuilder)
.execute().actionGet();
或:
- 参考:
- Java文档:
String analyser = "{...}";
CreateIndexRequestBuilder createIndexRequestBuilder =
client.admin().indices().prepareCreate("indexName");
createIndexRequestBuilder.setSettings(analyser);
createIndexRequestBuilder.execute().actionGet();
其中,您的分析仪类似于:
{
"analysis":
{
"analyzer":
{
"my_analiser":
{
"type": "english"
}
}
}
}
但是,您需要创建自己的自定义映射,并在其中指定分析器
如果未指定自己的映射,当Elasticsearch检测到文档中的新字符串字段时,它会自动将其配置为全文字符串字段,并使用标准分析器对其进行分析。这对您来说可能已经足够了,但通常情况下是不够的,您需要构建自己的映射。您也可以通过Java实现这一点
// Index (and mapping) do not exist
CreateIndexRequestBuilder createIndexRequestBuilder =
client.admin().indices().prepareCreate("indexName");
createIndexRequestBuilder.addMapping("typeName", mapping);
response = createIndexRequestBuilder.execute().actionGet();
// Index exists but not mapping
PutMappingRequestBuilder preparePutMappingBuilder =
client.admin().indices().preparePutMapping("indexName");
preparePutMappingBuilder.setSource(mapping).setType("typeName");
response = preparePutMappingBuilder.execute().actionGet();
如何使用Analyzer和两个
javaapi中的参数
可以使用类似布尔查询的复合查询组合两个术语查询:
- 参考:
- Java文档:
- 参考:
- Java文档: