如何使用boolquery builder进行ElasticSearch特殊字符搜索

abithluo  于 2022-12-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(247)

我使用BoolqueryBuilder搜索值与java Spring Boot 后端。
我需要在带有特殊字符的ElasticSearch值中进行搜索,如“@#$%test test search”

  • 有没有办法用querystring / matchquery / wildcard来获取搜索值。
  • 我的ElasticSearch索引名是document.,字段名是value
  • 是否需要创建自定义分析器才能进行此搜索。
  • 它也不应该影响正常的文本和数字搜索,它应该是大小写敏感。
krcsximq

krcsximq1#

以下是如何搜索数据的示例

PUT index_name/_doc/1
{
  "field_name": "@#$%test test search"
}

GET index_name/_search
{
  "query": {
    "query_string": {
      "default_field": "field_name",
      "query": "(@#)*"
    }
  }
}

参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_reserved_characters
上面的方法并不是最好的,所以我想给予更多的信息,解释如何更有效地搜索数据。在下图中,你将看到elasticsearch标准analyze在索引和搜索过程中是如何工作的。

如果您不需要分析器(在您的场景中可能不需要),可以使用不进行分析的keyword字段类型。
当您在Elasticsearch中将文档作为字符串进行索引时,ECS会自动为每个字符串创建2个字段,其中一个字段将命名为文本类型的field_name,另一个字段将命名为关键字类型的field_name.keyword,下面是一个示例:

PUT index_name/_doc/1
{
  "field_name": "@#$%test test search"
}

GET index_name/_search
{
  "query": {
    "wildcard": {
      "field_name.keyword": "@#$*"
    }
  }
}

GET index_name/_search
{
  "query": {
    "query_string": {
      "default_field": "field_name.keyword",
      "query": "@#*%* AND *test*"
    }
  }
}

case insensitive

GET index_name/_search
{
  "query": {
    "wildcard": {
      "field_name.keyword": {
        "value": "*TesT*",
        "case_insensitive": true
      }
    }
  }
}

相关问题