【问题标题】:Elasticsearch does not find characters other than alpha numericElasticsearch 找不到字母数字以外的字符
【发布时间】:2018-08-25 14:17:34
【问题描述】:

我遇到了搜索一些非字母数字字符的问题。

我尝试了许多分析器,但认为“空白”分析器非常适合我的问题。

我创建了一个索引 custom_doc 并发布了一个文档 { "body": "一些带有###井号#的文本", }

但我无法通过在查询字符串中传递哈希来找到此文档

   {
    "query": {
        "bool": {
            "must": [
                {
                    "query_string": {
                        "fields": [
                            "body"
                        ],
                        "query": "#",
                        "analyzer": "whitespace"
                    }
                }
            ]
        }
    }
   }

然而分析表明它被正确标记了

请求

{
    "analyzer": "whitespace",
    "text": "#"
}

结果

{
    "tokens": [
        {
            "token": "#",
            "start_offset": 0,
            "end_offset": 1,
            "type": "word",
            "position": 0
        }
    ]
}

没有自定义分析器,没有映射,没有额外的过滤器。 我该如何解决这个问题?我检查了许多类似的问题,但没有任何改善。有些人建议将该字段设置为“not_analyzed”,但我仍然希望有可能在查询字符串中使用通配符,因此将字段类型从“文本”更改为“关键字”也不适合我。例如。希望此查询“so*”返回已发布的文档。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    问题是您还需要在索引时指定whitespace 分析器。仅在搜索时使用它是不够的,因为您的正文将由标准分析器进行分析,该分析器已删除 # 符号,因此您无法在之后搜索它们。

    首先删除您的索引并使用以下映射重新创建它:

    DELETE index
    PUT index
    { 
      "mappings": {
        "doc": {
          "properties": {
            "body": {
              "type": "text",
              "analyzer": "whitespace",
              "search_analyzer": "whitespace"
            }
          }
        }
      }
    }
    

    然后索引您的文档:

    PUT index/doc/1
    { "body": "some text with ### hash signs # inside"}
    

    最后可以搜索#符号(注意不需要指定whitespace分析器):

    POST index/_search
    {
        "query": {
            "bool": {
                "must": [
                    {
                        "query_string": {
                            "fields": [
                                "body"
                            ],
                            "query": "#"
                        }
                    }
                ]
            }
        }
       }
    

    【讨论】:

    • 太好了,很高兴它有帮助!
    • 其实有。我想知道将数据从一个索引移动到另一个索引的正确方法是什么,因为不想在删除索引时丢失我的数据,并使用不同的分析器为已经存在的字段再次创建它。在 ES 文档中找到这篇文章 elastic.co/guide/en/elasticsearch/guide/current/reindex.html
    • 您需要使用Reindex API。使用起来非常简单。您使用正确的映射创建新索引,然后使用旧索引作为源和新索引作为目标来触发重新索引调用。完成!
    • 你又回家了。感谢您的快速解答。
    • 总是乐于提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多