繁体   English   中英

java:在elasticsearch中搜索子字符串

[英]java : search for substring in elasticsearch

我正在尝试在Elasticsearch中寻找子字符串,但是我所知道的和我编写的代码并没有完全按照我想要的方式寻找子字符串。

这是我编写的代码:

BoolQueryBuilder query = new BoolQueryBuilder();
            query.must(new QueryStringQueryBuilder("tagName : *"+tagName+"*"));

            SearchResponse response = esclient.prepareSearch(index).setTypes(type)
                    .setQuery(query)
                    .execute().actionGet();

            SearchHit[] hits = response.getHits().getHits();


            for (SearchHit hit : hits) {
                Map map = hit.getSource();
                list.add((String) map.get("tagName"));
            }

            list = list.stream().distinct().collect(Collectors.toList());

            for(int i = 0; i < list.size(); i++) {;
                jsonArrayBuilder.add((String) list.get(i));
            }

我正在尝试实现的是即使给定标记名与任何内容匹配的部分都应列出。

但以防万一,例如:如果我正在寻找一个名为“ social_security_number”的标签,然后键入“ social security”,那么我希望将其列出。 但是实际发生的是,如果我错过了下划线,它就不会列出来。 有可能做到吗? 我应该修改此代码以进行这种搜索吗?

这是我的索引结构:

POST arempris/emptagnames
{
  "mappings" : {
    "emptags":{
          "properties": {
                "employeeid": {
                  "type":"integer"
                },
                "tagName": {
                  "type": "text",
                  "fielddata": true,
                  "analyzer": "lowercase_keyword",
                  "search_analyzer": "lowercase_keyword"
                }
            }    
        }
    }
}

非常感谢您的帮助,并在此先感谢。

您设置的分析器不会标记任何内容,因此空间很重要。 指定一个将在空格和下划线以及可能会有用的任何东西上拆分的自定义分析器是一个很好的解决方案。 可以使用下面的方法,但是请仔细检查分析仪的功能,并访问不了解的每个部分的文档。

PUT stackoverflow
{
  "settings": {
    "analysis": {
      "analyzer": {
        "customanalyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "standard",
            "generatewordparts"
          ]
        }
      },
      "filter": {
        "generatewordparts": {
          "type": "word_delimiter",
          "split_on_numerics": false,
          "split_on_case_change": false,
          "generate_word_parts": true,
          "generate_number_parts": false,
          "stem_english_possessive": false,
          "catenate_all": false
        }
      }
    }
  },
  "mappings": {
    "emptags": {
      "properties": {
        "employeeid": {
          "type": "integer"
        },
        "tagName": {
          "type": "text",
          "fielddata": true,
          "analyzer": "customanalyzer",
          "search_analyzer": "customanalyzer"
        }
      }
    }
  }
}

GET stackoverflow/emptags/1
{
  "employeeid": 1,
  "tagName": "social_security_number"
}

GET stackoverflow/_analyze
{
  "analyzer" : "customanalyzer",
  "text" : "social_security_number123"
}

GET stackoverflow/_search
{
  "query": {
    "query_string": {
      "default_field": "tagName",
      "query": "*curi*"
    }
  }
}

另一个解决方案是对输入进行规范化,并用空白替换要作为空白处理的任何符号(例如,下划线)。

在这里阅读更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM