gpt4 book ai didi

ElasticSearch 不返回针对字符串属性的术语查询结果

转载 作者:行者123 更新时间:2023-11-29 02:43:24 25 4
gpt4 key购买 nike

我有以下索引文档:

{
"visitor": {
"id": <SOME STRING VALUE>
}
}

文档的映射是:

"visitor": {
"properties": {
"id": {
"type": "string"
}
}
}

当我运行以下查询时,我得到了结果:

{
"query": {
"filtered": {
"query": {
"match_all": {}
}
},
"filter": {
"term": { "visitor.id": "123" }
}
}
}

但是这不会:

{
"query": {
"filtered": {
"query": {
"match_all": {}
}
},
"filter": {
"term": { "visitor.id": "ABC" }
}
}
}

我一直认为这与分析器有关,并且一直在追查。我也一直在想我是否错误地使用点符号来访问嵌套的访问者属性。

谁能告诉我为什么我不能过滤 ID 为“ABC”的访问者但可以过滤访问者 123

最佳答案

您需要了解 elasticsearch 的分析器是如何工作的。分析器执行标记化(将输入拆分为一堆标记,例如空格)和一组标记过滤器(过滤掉您不需要的标记,如 stop words ,或修改标记,如 lowercase token filter它将所有内容都转换为小写)。

分析在两个非常特定的时间执行 - 在索引期间(当您将内容放入 elasticsearch 时),以及根据您的查询,在搜索期间(在您正在搜索的字符串上)。

也就是说,默认分析器是 standard analyzer其中包括 standard tokenizer , standard token filter (从标准分词器中清除分词),lowercase token filter , 和 stop words token filter .

举个例子,当您保存字符串“I love Vincent's pie!”时进入 elasticsearch,并且您使用的是默认的标准分析器,您实际上存储的是“i”、“love”、“vincent”、“s”、“pie”。然后,当您尝试使用 term 查询(未分析)搜索“Vincent's”时,您将找不到任何内容,因为“Vincent's”不是其中之一 token !但是,如果您使用匹配 查询(经过分析)搜索“Vincent's”,您会发现“I love Vincent's pie!”因为“vincent”和“s”都能找到匹配项。

底线,要么:

  1. 在搜索自然语言字符串时使用经过分析的查询,例如 match
  2. 根据您的需要设置分析仪。如果您想变得复杂,您可以设置一个自定义分析器来执行空白分词器、字母分词器或模式分词器,以及您想要的任何过滤器。这取决于您的用例,但如果您要处理自然语言句子,我不建议这样做,因为标准分词器是为自然语言搜索而构建的。
  3. 您可以将字段设置为不使用具有以下映射的分析器,这应该适合您的需要:

    "visitor": {
    "properties": {
    "id": {
    "type": "string"
    "index": "not_analyzed"
    }
    }
    }

参见 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis.html进一步阅读。

关于ElasticSearch 不返回针对字符串属性的术语查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21933787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com