首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中使用Analyzer和两个参数执行弹性搜索术语查询

如何在Java中使用Analyzer和两个参数执行弹性搜索术语查询
EN

Stack Overflow用户
提问于 2016-03-27 21:09:27
回答 2查看 2.8K关注 0票数 0

我是新的弹性搜索,我是集成它与MongoDB,以索引和搜索数据。

所有这些都很好,我使用以下示例构建索引:

代码语言:javascript
复制
    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服务,它将使用Java来执行所需的搜索查询。

我需要使用两个相同的值“术语查询”在构建的索引中进行搜索。我知道对于术语查询,我们需要使用分析器来分析文本并能够检索相同的值。

我尝试过几种方法来为某些字段构建索引和指定分析器,但我做不到。我也尝试过从Java级别进行索引和指定分析器,它运行得很好,但只有一个字段不能用两个字段来实现。

代码语言:javascript
复制
 SearchResponse r1 = client.prepareSearch("rootcause")
                    .setQuery(QueryBuilders.queryString("_id:" + rc.getRootCause_ID()).analyzer("snowball"))
                    .execute() 
                    .actionGet();

我正在建立一个原型来诊断一些设备故障,

我想通过设备模型和用户输入的症状进行搜索。我还尝试了以下代码:

代码语言:javascript
复制
    SearchResponse response = client.prepareSearch("modelsymptom")
            .setQuery(QueryBuilders.queryString("model_id: " + "MO-1" + " AND " + "symptom: RC-4").analyzer("snowball"))
            .execute()
            .actionGet();

从上述查询中检索到的结果包含RC-4或MO-1和其他不正确的所有文档。此查询只应检索一个结果。

使用指定的分析器构建索引,或者从Java级别进行索引,还有什么更好的呢?

根据我的理解,我认为用索引构建分析器会更好,但我不知道到目前为止是怎样的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-28 23:00:28

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

那是不对的。

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

查询全文字段时,应使用匹配查询,以了解如何分析该字段。

否则,您将遇到以下问题:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

使用指定的分析器构建索引,或者从Java级别进行索引,还有什么更好的呢?

不管是哪种情况,都取决于您的具体情况。

如果需要,可以使用Java的分析器创建索引。

代码语言:javascript
复制
String analyser = "{...}";

CreateIndexRequestBuilder createIndexRequestBuilder = 
    client.admin().indices().prepareCreate("indexName");
createIndexRequestBuilder.setSettings(analyser);
createIndexRequestBuilder.execute().actionGet();

你的分析器是这样的:

代码语言:javascript
复制
{
    "analysis": 
    {    
        "analyzer": 
        {
            "my_analiser": 
            {
                "type": "english"
            }
        }
    }
}

但是,您将需要创建您自己的自定义映射,并在那里指定分析器。

如果您没有指定自己的映射,当Elasticsearch检测到文档中的新字符串字段时,它会自动将其配置为全文字符串字段,并使用标准分析器对其进行分析。这可能对您来说已经足够了,但通常情况下是不够的,您需要构建自己的映射。您也可以通过Java实现这一点。

代码语言:javascript
复制
// 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();

如何利用分析器和Java中的两个参数进行弹性搜索术语查询

可以使用复合查询(如布尔查询)组合两个术语查询:

或者使用术语查询:

但是根据您在这里所描述的,如果您确实需要使用分析过的文本,您更可能需要多匹配查询,或者使用两个匹配查询的布尔查询。

代码语言:javascript
复制
MultiMatchQueryBuilder queryBuilder = 
   new MultiMatchQueryBuilder("foo", "fieldOne", "fieldTwo");
client.prepareSearch()
     .setIndices(index)
     .setQuery(queryBuilder)
     .execute().actionGet();

或者:

代码语言:javascript
复制
QueryBuilder firstQueryBuilder = QueryBuilders.matchQuery("fieldOne", "foo");
QueryBuilder secondQueryBuilder = QueryBuilders.matchQuery("fieldTwo", "foo");
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(firstQueryBuilder);
boolQueryBuilder.must(secondQueryBuilder);
client.prepareSearch()
     .setIndices(index)
     .setQuery(queryBuilder)
     .execute().actionGet();

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2016-03-27 22:39:18

您不需要任何特殊的分析器,只需使用bool查询与“必须”和两个术语。而“简单查询”主要存在于手动测试查询,我不会在代码中使用它。此外,始终首先使用REST尝试查询。

代码语言:javascript
复制
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "model": "XXXX",
          }
        },
        {
          "term": {
            "symptom": "YYYY" 
          }
        }
      ]
    }
  }
}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36252691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档