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

当字段包含~时过滤弹性搜索数据

羿经武
2023-03-14

我有一堆像下面这样的文件。我想过滤projectkey以~开头的数据。我确实读过一些文章,其中说~是弹性查询中的一个运算符,因此无法真正使用它进行过滤。有人能帮你建立搜索查询/branch/u搜索API吗??

{
  "_index": "branch",
  "_type": "_doc",
  "_id": "GAz-inQBJWWbwa_v-l9e",
  "_version": 1,
  "_score": null,
  "_source": {
    "branchID": "refs/heads/feature/12345",
    "displayID": "feature/12345",
    "date": "2020-09-14T05:03:20.137Z",
    "projectKey": "~user",
    "repoKey": "deploy",
    "isDefaultBranch": false,
    "eventStatus": "CREATED",
    "user": "user"
  },
  "fields": {
    "date": [
      "2020-09-14T05:03:20.137Z"
    ]
  },
  "highlight": {
    "projectKey": [
      "~@kibana-highlighted-field@user@/kibana-highlighted-field@"
    ],
    "projectKey.keyword": [
      "@kibana-highlighted-field@~user@/kibana-highlighted-field@"
    ],
    "user": [
      "@kibana-highlighted-field@user@/kibana-highlighted-field@"
    ]
  },
  "sort": [
    1600059800137
  ]
}

更新***

我在下面使用prerana的答案在我的查询中使用-prefix

当我使用前缀和范围时仍然有问题-我得到以下错误-我缺少什么??

GET /branch/_search
{
  "query": {
    "prefix": {
      "projectKey": "~"
    },
    "range": {
      "date": {
        "gte": "2020-09-14",
        "lte": "2020-09-14"
      }
    }
  }
}



    {
  "error": {
    "root_cause": [
      {
        "type": "parsing_exception",
        "reason": "[prefix] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
        "line": 6,
        "col": 5
      }
    ],
    "type": "parsing_exception",
    "reason": "[prefix] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
    "line": 6,
    "col": 5
  },
  "status": 400
}

共有2个答案

史绍晖
2023-03-14

虽然@hansley答案可以工作,但它需要您创建一个自定义分析器,并且仍然如您所提到的,您只想获取以~开头的文档,但在他的结果中,我看到了所有包含~的文档,因此提供我的答案,它需要非常少的配置并按要求工作。

索引映射默认值,因此只需在docs和ES下面建立索引,即可创建带有的默认映射。所有文本的关键字字段

索引样本文档

{
    "title" : "content1 ~"
}

{
    "title" : "~ staring with"
}

{
    "title" : "in between ~ with"
}

搜索查询应该从示例文档中获取第二个文档

{
  "query": {
    "prefix" : { "title.keyword" : "~" }
  }
}

和搜索结果

"hits": [
            {
                "_index": "pre",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "title": "~ staring with"
                }
            }
        ]

有关详细信息,请参阅前缀查询

更新1:

索引映射:

{
  "mappings": {
    "properties": {
      "date": {
        "type": "date" 
      }
    }
  }
}

指数数据:

{
    "date": "2015-02-01",
    "title" : "in between ~ with"
}
{
    "date": "2015-01-01",
    "title": "content1 ~"
}
{
    "date": "2015-02-01",
     "title" : "~ staring with"
}
{
    "date": "2015-02-01",
    "title" : "~ in between with"
}

搜索查询:

{
    "query": {
        "bool": {
            "must": [
                {
                    "prefix": {
                        "title.keyword": "~"
                    }
                },
                {
                    "range": {
                        "date": {
                            "lte": "2015-02-05",
                            "gte": "2015-01-11"
                        }
                    }
                }
            ]
        }
    }
}

搜索结果:

"hits": [
      {
        "_index": "stof_63924930",
        "_type": "_doc",
        "_id": "2",
        "_score": 2.0,
        "_source": {
          "date": "2015-02-01",
          "title": "~ staring with"
        }
      },
      {
        "_index": "stof_63924930",
        "_type": "_doc",
        "_id": "4",
        "_score": 2.0,
        "_source": {
          "date": "2015-02-01",
          "title": "~ in between with"
        }
      }
    ]

和魁
2023-03-14

如果我很理解你的问题,我建议创建一个自定义分析器来搜索特殊字符。

我在将~替换为\uuu SPECIAL\uu时进行了如下本地测试:

我用一个自定义的char_过滤器创建了一个索引,并在projectKey字段中添加了一个字段。新multi_字段的名称为特殊_字符。

以下是映射:

PUT wildcard-index
{
"settings": {
    "analysis": {
    "char_filter": {
        "special-characters-replacement": {
        "type": "mapping",
        "mappings": [
            "~ => __SPECIAL__"
        ]
        }
    },
    "analyzer": {
        "special-characters-analyzer": {
        "tokenizer": "standard",
        "char_filter": [
            "special-characters-replacement"
        ]
        }
    }
    }
},
"mappings": {
    "properties": {
    "projectKey": {
        "type": "text",
        "fields": {
        "special_characters": {
            "type": "text",
            "analyzer": "special-characters-analyzer"
        }
        }
    }
    }
}
}

然后我在索引中摄取了以下内容:

“projectKey”:“content1 ~”

“projectKey”:“这是一个内容”

“projectKey”:“~路上的汽车”

“projectKey”:“o ngram”

然后,查询是:

GET wildcard-index/_search
{
"query": {
    "match": {
    "projectKey.special_characters": "~"
    }
}
}

答复是:

"hits" : [
  {
    "_index" : "wildcard-index",
    "_type" : "_doc",
    "_id" : "h1hKmHQBowpsxTkFD9IR",
    "_score" : 0.43250346,
    "_source" : {
      "projectKey" : "content1 ~"
    }
  },
  {
    "_index" : "wildcard-index",
    "_type" : "_doc",
    "_id" : "iFhKmHQBowpsxTkFFNL5",
    "_score" : 0.3034693,
    "_source" : {
      "projectKey" : "This ~ is a content"
    }
  },
  {
    "_index" : "wildcard-index",
    "_type" : "_doc",
    "_id" : "-lhKmHQBowpsxTkFG9Kg",
    "_score" : 0.3034693,
    "_source" : {
      "projectKey" : "~ cars on the road"
    }
  }
]

如果您有任何问题,请告诉我,我将很乐意为您提供帮助。

注意:如果~后面有空格,则此方法有效。从响应中可以看出,没有显示第4个数据。

 类似资料:
  • 我有一份这样的文件 下面是我到目前为止所尝试的

  • 作为参考,我使用的是Elasticsearch 6.4.0 我有一个Elasticsearch查询,它返回一定的命中视频数,我正在尝试删除文本字段值过于相似的命中。我的查询是: 此查询使用自定义函数分数和筛选器来返回用户可能喜欢的书籍(他们尚未创作的书籍)。对于某些人来说,它返回的名字非常相似的书(即乔治·华盛顿的一生,乔治·华盛顿的美好时光,谁是乔治·华盛顿),我希望热门歌曲有一套更多样化的名字

  • 我使用的是ES版本5.6。我有一个像下面这样的文档存储在ES中。 我想搜索所有已“启用”的字段。 我尝试了以下查询,但都不起作用。 但是下面的查询起作用了 因此,看起来只匹配顶级字段,而不匹配嵌套字段。是否有任何方法可以查询包含在所有字段中的文本,包括嵌套字段。我不想显式指定嵌套字段名。我正在寻找一种全局搜索,我想在文档中的任何地方搜索“文本”。 谢了。

  • 我试图使用过滤器聚合来支持前端的多选择方面值。 我有颜色和深度滤镜。 滤色器保存值:黑色(5)、蓝色(3)、红色(2) 深度过滤器保持值:70mm(3)、60mm(5)、50mm(3) 当我在滤色器中选择黑色时,所有其他选项(蓝色,红色)都没有响应。 我尝试添加 谢了,Sree。

  • 我正在使用以下搜索: 我现在想使用弹性搜索在索引过程中提供的id ()来过滤结果。例如,{}。我猜你得用查询这个词。结果应该是只有当< code>_id匹配时,文档才返回。我该怎么做呢?

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