当前位置: 首页 > 知识库问答 >
问题:

弹性搜索连字符问题与术语过滤器

赖俊
2023-03-14

我有以下弹性搜索查询只有一个术语过滤器。我的问题要复杂得多,但我只是想在这里展示这个问题。

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

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

有没有办法跳过连字符,这样过滤器就会返回结果?我曾试图用反斜杠来逃避连字符,这是我从Lucene论坛上读到的,但没有用。

此外,如果我将GUID值传递到这个字段中,该字段用连字符连接并用大括号括起来,比如-{ASD23-34SD-DFE1-42FWW},我是否需要将字母表字符小写,是否也需要将大括号转义?

谢谢

共有3个答案

舒仲渊
2023-03-14

根据@imotov的答案,如果您使用sping-data-elasticsearch,那么您所需要做的就是将您的字段标记为:

@Field(type = FieldType.String, index = FieldIndex.not_analyzed)

而不是

@Field(type = FieldType.String)

问题是您需要删除索引,并使用新映射重新实例化它。

王飞虎
2023-03-14

对于弹性6.1,被接受的答案不适用于我。我使用elastic默认为字符串字段提供的“关键字”字段解决了这个问题。

{
    "filter": {
            "term": {
                    "field.keyword": "update-time"
                }
        }
}
孙福
2023-03-14

我猜您的字段已被分析,这是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"
        }
    }
}'

请记住,如果你的字段被分析,那么这个记录也会通过搜索单词“更新”或单词“时间”来找到。

 类似资料:
  • 我正在尝试在Elastic 2中创建一个过滤索引别名。十、 以下是所有青少年的资料,不分性别。我只想在这个过滤器里看到雌性。 这就是我试图创建索引别名的原因: 我看了这个问题,似乎是相同的答案,但是我的JSON一定有问题。 Elasticsearch将范围和术语连接到相同的数组项

  • 问题内容: 我只有一个词过滤器,下面的elasticsearch查询。我的查询要复杂得多,但我只是想在此处显示问题。 当我将带连字符的值传递给过滤器时,返回的结果为零。但是,如果我尝试不使用未连接的值,则会得到结果。我不确定连字符是否在这里成为问题,但是我的情况使我相信。 有没有办法避免连字符,以便过滤器返回结果?我曾尝试从Lucene论坛上读到带有反斜杠的转义符,但这无济于事。 另外,如果我将G

  • 由于已经有很多关于连字符的问题,我已经尝试了以下解决方案: 使用字符筛选器:ElasticSearch-在名称中使用连字符进行搜索。 所以我做了这个映射: 所以char筛选器似乎没有在搜索字符串上执行?我该怎么做才能让它起作用?

  • 我在布尔查询中有一个筛选器问题。 我想应用一个基于3个字段的筛选器,其中至少有1个筛选器匹配: 我在这个查询中没有得到任何结果,但是我在索引中看到了很多相关的文档。 Opster Elasticsearch忍者测试: 例如你向我提出的1个例子,我有许多返回的结果。 然而,当我想对对象字段执行必须查询时,我没有得到与筛选器完美匹配的相同结果。 这里有一个例子: 仅使用must子句进行搜索 首先出现的

  • 基数聚合计算不同值的近似计数。但是,为什么即使对于存储在单个碎片中的索引,它也显示不正确的值呢?

  • 早些时候,我在我的应用程序中使用TransportClient。最近转向AWS管理弹性搜索服务。了解到AWS管理的ES群集不支持TransportClient。 因此,将代码迁移到使用BulkProcessort将文档插入ES的地方。当我重构代码作为ES留档的一部分时,我添加了这一行。 我在client::bulkAsync上得到一个错误,说client不是功能接口。 需要帮助理解我做错了什么。