我需要在Elasticsearch中更改Map以使用特殊字符进行搜索吗?

3mpgtkmj  于 2023-04-20  发布在  ElasticSearch
关注(0)|答案(1)|浏览(99)

我有一个集群运行,我遇到了一个问题,涉及到包括特殊字符在我的搜索查询。现在我没有设置Map的索引Map是动态的,分析器也是标准的。有关分析器的信息,我从“分析API”。

>  
> GET /<index>/_analyze
> {
>    "text": "some-data"
> }

给了我输出

{
  "tokens": [
    {
      "token": "some",
      "start_offset": 0,
      "end_offset": 4,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "data",
      "start_offset": 5,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

我当前的Map

message": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }

由于这个输出,我得出结论,这里的分析器是标准的,特殊字符没有索引。现在,当我试图在搜索查询中包含特殊字符时,我没有得到想要的结果,当我试图在搜索查询中使用另一个分析器时,我收到空结果。
现在我的问题是,除了改变Map之外,我有没有其他方法可以在搜索查询中包含特殊字符。

编辑:让我给予你一个例子

假设我在elasticsearch中索引了4个短语
带有some-data的数据
数据与一些数据
资料
一些
现在当我像这样进行搜索查询时

GET index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "some-data"
          }
        }
      ]
    }
  }
}

我得到了所有的4个句子作为结果。〈----这不是一个期望的输出
我想要的输出是
带有some-data的数据
这是唯一的结果,应该来作为一个击中,但相反,我得到所有的句子作为击中。
现在我也发射了术语查询

GET index/_search
{
  "query": {
    "term": {
      "message.keyword": {
        "value": "some-data"
      }
    }
  }
}

这检索到空结果
最接近的一次是我开枪的时候

GET index/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "multi_match": {
                "query": "some-data",
                "type": "phrase"
              }
            }
          ]
        }
      }
    }

发射时检索到2个结果

数据与一些数据
data with some-data

现在有没有一种方法或查询,我可以发射,使我只收到

data with some-data

作为结果
问候

niwlg2el

niwlg2el1#

选项是通过Term Level Queries(确切术语)进行搜索,如下所示:message.keyword。但是,您将失去Full Text Queries的功能。要在全文查询中使用特殊字符,例如匹配查询,您需要编辑Map(您可以使用空白分析器)并重新索引(Reindex API建议)。
更新:
如果你不能使用另一个分析器,你可以在关键字字段上使用wildcard。但是你必须假设一些性能问题。
避免以 * 或?开头的模式。这会增加查找匹配项所需的迭代次数,并降低搜索性能。
就像这样:

{
  "query": {
    "wildcard": {
      "message.keyword": {
        "value": "*some-data*"
      }
    }
  }
}

相关问题