elasticsearch - 术语过滤器的 Elasticsearch 连字符问题

标签 elasticsearch filter escaping

我有以下只有一个词过滤器的 Elasticsearch 查询。我的查询要复杂得多,但我只是想在这里说明问题。

{
    "filter": {
            "term": {
                    "field": "update-time"
                }
        }
}

当我将带连字符的值传递给过滤器时,返回的结果为零。但是,如果我尝试不使用未连字符的值,我会得到结果。我不确定这里连字符是否是一个问题,但我的情况让我相信。

有没有办法转义连字符以便过滤器返回结果?我曾尝试用我从 Lucene 论坛上读到的反斜杠转义连字符,但这没有帮助。

此外,如果我将一个 GUID 值传递到这个用大括号连字符并包围的字段中,例如 - {ASD23-34SD-DFE1-42FWW},我是否需要将字母字符小写并且我需要也逃避大括号?

谢谢

最佳答案

我猜你的字段被分析了,这是 elasticsearch 中字符串字段的默认设置。结果,当它建立索引时,它没有被索引为一个术语“更新时间”,而是被索引为两个术语:“更新”和“时间”。这就是为什么您的术语搜索找不到该术语的原因。如果您的字段将始终包含必须按原样完全匹配的值,则最好在映射中将此类字段定义为未分析。您可以通过使用新映射重新创建索引来实现:

curl -XPUT http://localhost:9200/your-index -d '{
    "mappings" : {
        "your-type" : {
            "properties" : {
                "field" : { "type": "string", "index" : "not_analyzed" }
            }
        }
    }
}'

curl -XPUT  http://localhost:9200/your-index/your-type/1 -d '{
    "field" : "update-time"
}'

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
    "filter": {
        "term": {
                "field": "update-time"
        }
    }
}'

或者,如果您希望根据该字段更灵活地查找记录,您可以继续分析该字段并改用文本查询:

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
    "query": {
        "text": {
                "field": "update-time"
        }
    }
}'

请记住,如果您的字段已被分析,则只需搜索单词“更新”或单词“时间”即可找到此记录。

关于elasticsearch - 术语过滤器的 Elasticsearch 连字符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11566838/

相关文章:

python - Elasticsearch在Python控制台上打印PUT语句

elasticsearch - _all elasticsearch中每个字段的条件与每个字段的值

elasticsearch 字段间比较

python - 过滤多维数组

c++ - 用于滤波器设计的 remez 交换算法的实现

jQuery 解析 JSON

SQLite3 : Insert BLOB with NULL characters in C++

elasticsearch - Elasticsearch中的升压滤波器

php - 显示从数据库中选择的选项结果

MySQL CHAR() 函数和 UTF8 输出?