elasticsearch 如何在elasticsearch simple\u query\u字符串中包含除空格以外的所有字符?,elasticsearch,elasticsearch" /> elasticsearch 如何在elasticsearch simple\u query\u字符串中包含除空格以外的所有字符?,elasticsearch,elasticsearch" />

elasticsearch 如何在elasticsearch simple\u query\u字符串中包含除空格以外的所有字符?

elasticsearch 如何在elasticsearch simple\u query\u字符串中包含除空格以外的所有字符?,elasticsearch,elasticsearch,我正在寻找elasticsearch中最简单的查询系统,其中唯一的分隔符是空格。我想用几乎所有类型的字符来查询用户名,例如@username或@u$er-na_me 它认为这很容易,但经过长时间的搜索后,我才找到了一个“空白”分析器: query.json: { "query": { "simple_query_string" : { "query": "@username", "fields": ["mytextfield"], "a

我正在寻找elasticsearch中最简单的查询系统,其中唯一的分隔符是空格。我想用几乎所有类型的字符来查询用户名,例如@username或@u$er-na_me

它认为这很容易,但经过长时间的搜索后,我才找到了一个“空白”分析器:

query.json:

{
  "query": {
    "simple_query_string" : {
        "query": "@username",
        "fields": ["mytextfield"],
        "analyzer": "whitespace",
        "default_operator": "and"
    }
  }
}
我运行时使用:
curl-X POST”http://localhost:9200/my.index/_search?pretty“-H”内容类型:application/json'-d'@query.json'

然而,它什么也不返回

其他详情:

  • “查询”:“用户名”
    仍然有效

  • 如果我删除了
    “分析器”:“空白”
    ,那么我会得到与
    “查询”:“用户名”
    “查询”:“@username”

  • 我在SO(例如)中看到过类似的帖子,它们似乎创建了新的索引或映射。如果是这样的话,我将非常感谢您提供一些资源来了解工作流程


总之,是否有任何简单的方法可以配置elasticsearch或查询,使其仅使用空格(理想情况下是基本标点符号)进行标记化?

toto____________________________________

1) 使用单个分析字段创建索引:

PUT totoindex
{
  "mappings": {
      "_doc": {
        "properties": {
          "mytextfield":{"type":"text", "analyzer": "whitespace"}
        }
      }
    }
}
2) 为一些示例文档编制索引:

POST totoindex/_doc/
{
  "mytextfield": "@toto_tico"
}
POST totoindex/_doc/_search
{
  "query": {
    "simple_query_string" : {
        "query": "@toto_tico",
        "fields": ["mytextfield"]
    }
  }
}
3) 搜索文档:

POST totoindex/_doc/
{
  "mytextfield": "@toto_tico"
}
POST totoindex/_doc/_search
{
  "query": {
    "simple_query_string" : {
        "query": "@toto_tico",
        "fields": ["mytextfield"]
    }
  }
}
答复:

{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "totoindex",
        "_type": "_doc",
        "_id": "MtorKW8BavUEUOqEr6k_",
        "_score": 0.2876821,
        "_source": {
          "mytextfield": "@toto_tico"
        }
      }
    ]
  }
}

尽管@baitmbarek提供了问题的一般/快速答案,但它需要对问题有一些了解。因此,我将尝试从新手的角度为这个问题提供一个简单的答案

首先索引,然后搜索! 现在,我这么说;我觉得很明显。如果希望以某种方式进行搜索,则应以这种方式创建索引

一旦建立索引,就没有回头路了 并非绝对正确,您可以创建新索引,然后创建别名然而,从新手的角度来看,没有回头路通常是这样

熟悉弹性搜索术语 下面是这篇文章的列表:索引、文档、分析器、标记器、映射

当然有,还有

台阶
  • 删除当前索引和当前拥有的数据
  • 创建具有所需特征的索引。这是我的问题(空格和简单的标点符号)
  • 2.1。用于ElasticSearch 7

    curl -XPUT localhost:9200/[MY_INDEX] -H 'Content-Type: application/json' -d'
    {
        "settings": {
            "analysis": {
                "tokenizer": {
                    "MY_TOKENIZER": { 
                          "type": "char_group", 
                          "tokenize_on_chars":["whitespace", "\n", ".", ",", ";", ":", "\"", "`", "]", "[", ")", "(", "!", "?", "/", "\\", "–", "<", "<", "|", "+", "=", "~", "-", "&", "%", "*", "^", "\u0027"]
                    }
                },
                "analyzer": {
                    "MY_ANALYZER": {
                        "type":      "custom",
                        "filter" : ["lowercase"],
                        "tokenizer": "MY_TOKENIZER"
                    }
                }
            }
        },
        "mappings": {
            "properties": {
              "MY_TEXT_FIELD":{"type":"text", "analyzer": "MY_ANALYZER"}
            }
        }
    }
    '
    
  • 并像往常一样进行搜索(无需在此处指定任何内容;
    MY_TEXT_字段
    已使用
    MY_ANALYZER
    编制索引,因此它知道如何进行搜索):

  • [1] 老实说,弹性搜索的查询系统对新手非常友好(当然非常强大,但体积庞大,学习曲线陡峭),因此很容易忘记这里发生了什么。Elasticsearch是开箱即用的,后来你意识到开箱即用不是你所需要的。

    Hi@toto\u tico你能分享你的地图吗?你的字段是用空白分析器分析的吗?我几乎不理解你的问题,这让我觉得我没有用空白分析器分析字段。但是,这是有道理的
    mytextfield
    也需要事先进行分析:我读过一些关于标准分析器的文章,但对其进行更改并非易事。如何共享我的映射?同时,我已经计算出我想要使用的标记器是char\u group:
    “标记器”:{“type”:“char\u group”,“tokenize\u on\u chars:[“whitespace”,“\n”,“,”,“;”,“:”,“,“,”,“\”]
    。我仍在想如何将所有这些放在一起,但ES有很多概念不容易理解。感谢@baitmbarek,我还了解到我无法更改当前索引,因此它应该是一个新的索引。实际上,我从未创建任何索引,我只是使用Monstach将数据从mongoDB迁移到elasticsearch。这创建了自动索引,我猜它使用默认的analyzer/tokenizer。这让我很清楚应该尝试什么,但我需要一段时间来整理这些东西(我正在处理大型mongo集合)。似乎我应该更改标记器而不是analyzer。
    curl -XPOST localhost:9200/[MY_INDEX]/_doc/
    {
      "MY_TEXT_FIELD": "here is @toto_tico!"
    }
    
    curl -XPOST localhost:9200/MY_INDEX/_search
    {
      "query": {
        "simple_query_string" : {
            "query": "@toto_tico",
            "fields": ["MY_TEXT_FIELD"]
        }
      }
    }