Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Spring 如何在JavaAPI中使用Analyzer和两个参数执行弹性搜索词查询_Spring_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Java - Fatal编程技术网 elasticsearch,java,Spring,elasticsearch,Java" /> elasticsearch,java,Spring,elasticsearch,Java" />

Spring 如何在JavaAPI中使用Analyzer和两个参数执行弹性搜索词查询

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

我是弹性搜索的新手,我正在将其与MongoDB集成以索引和搜索数据

所有这些都工作正常,我使用以下示例构建索引:

    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文档:

希望这有帮助

我知道,对于术语查询,我们需要使用分析器来分析文本 并且能够检索相同的值

这是不对的

全文查询将在执行之前分析查询字符串,而术语级查询则对存储在倒排索引中的确切术语进行操作

查询全文字段时,请改用匹配查询,它可以了解字段的分析方式

否则,您将遇到此处描述的问题:

使用指定的分析器构建索引或 它是从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文档:

但是根据您在这里所描述的,如果您真的需要使用分析过的文本,那么您更可能需要多匹配查询,或者是带有t的布尔查询