【问题标题】:How to include all characters but whitespace in elasticsearch simple_query_string?如何在elasticsearch simple_query_string中包含除空格之外的所有字符?
【发布时间】:2019-12-21 10:15:58
【问题描述】:

我正在寻找 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 'Content-Type: application/json' -d '@query.json'

但是,它什么也不返回。

其他细节:

  • "query": "username" 仍然有效

  • 如果我删除"analyzer": "whitespace",那么"query": "username""query": "@username" 会得到相同的结果

  • 我在 SO(例如 Simple query string with special characters such as ( and =)中看到过类似的帖子,它们似乎创建了新的索引或映射。如果这是要走的路,我将不胜感激一些资源来了解工作流程。

因此,总而言之,是否有任何简单的方法可以配置弹性搜索或查询以仅使用空格(以及理想的基本标点符号)进行标记?

【问题讨论】:

  • 嗨@toto_tico 你能分享你的地图吗?您的字段是否使用空白分析器进行了分析?
  • 我几乎看不懂你的问题,这让我觉得我没有用空白分析器分析这个领域。但是,这是有道理的; mytextfield 也需要先验分析:我已经阅读了一些关于标准分析器的内容,但改变它并不是直截了当的。如何分享我的地图?
  • 同时,我已经确定了我想使用的标记器是 char_group:"tokenizer": { "type": "char_group", "tokenize_on_chars":["whitespace", "\n", ".", ",", ";", ":", "'", "\"" ]}。我还在想怎么把所有这些放在一起,但是 ES 有很多不容易消化的概念。

标签: elasticsearch


【解决方案1】:

toto_tico,您需要分析您的字段并在映射中指定它,如下所示:

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

PUT totoindex
{
  "mappings": {
      "_doc": {
        "properties": {
          "mytextfield":{"type":"text", "analyzer": "whitespace"}
        }
      }
    }
}

2) 索引一些示例文档:

POST totoindex/_doc/
{
  "mytextfield": "@toto_tico"
}

3) 搜索文档:

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,我还读到我无法更改当前索引,所以它应该是一个新索引。实际上,我从未创建任何索引,我只是使用 monstache 将我的数据从 mongoDB 迁移到 elasticsearch。这会自动创建索引,我猜它使用默认的分析器/标记器。这让我对尝试什么有了一个很好的了解,但是我需要一段时间才能将这些东西放在一起(我正在使用大型 mongo 集合)。看来我应该更改标记器而不是分析器。
【解决方案2】:

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

先索引,后搜索!

现在,我要说的是;我觉得很明显[1]。如果您希望以某种方式进行搜索,则应以这种方式创建索引。

一旦编入索引,就没有回头路了

不完全正确,您可以创建一个新索引,然后创建一个别名。 但是,没有回头路,从新手的角度来看,情况通常如此。

熟悉弹性搜索命名法

以下是此特定帖子的列表:索引、文档、分析器、标记器、映射。

当然,有glossary,还有guide

步骤

  1. 删除您当前的索引,以及您当前拥有的数据
curl -X DELETE "localhost:9200/YOUR_INDEX"
  1. 创建具有您需要的特征的索引。这是我的问题(空格和简单的标点符号)

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"}
        }
    }
}
'

2.2 对于 ElasticSearch 6:

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": {
      "_doc": {
        "properties": {
          "MY_TEXT_FIELD":{"type":"text", "analyzer": "MY_ANALYZER"}
        }
      }
    }
}
'
  1. 插入您的文档
curl -XPOST localhost:9200/[MY_INDEX]/_doc/
{
  "MY_TEXT_FIELD": "here is @toto_tico!"
}
  1. 然后像往常一样搜索(此处无需指定任何内容;MY_TEXT_FIELD 已使用 MY_ANALYZER 进行索引,因此它知道如何搜索):
curl -XPOST localhost:9200/MY_INDEX/_search
{
  "query": {
    "simple_query_string" : {
        "query": "@toto_tico",
        "fields": ["MY_TEXT_FIELD"]
    }
  }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多