【问题标题】:Elasticsearch can't recognize phrase terms?Elasticsearch 不能识别词组?
【发布时间】:2019-10-03 17:50:36
【问题描述】:

我正在尝试计算我的terms or keywords 在我指定的查询中出现了多少次或多少个文档

这是我的“内容”字段的映射

这是我的聚合查询:

"aggs" => [
    "KEYWORDS" => [
        "filters" => [
            "filters" => [
                "term1" => [
                    "term" => [
                        'content' => "isko"
                    ]
                ],
                "term2" => [
                    "term" => [
                        'content' => "manila"
                    ]
                ]
            ]
        ]
    ]
]

下面是回复:

我几乎接近我想要的输出,但是当我想要正确短语/关键字时,Elasticsearch 无法识别它

"aggs" => [
    "KEYWORDS" => [
        "filters" => [
            "filters" => [
                "term1" => [
                    "term" => [
                        'content' => "mayor isko moreno"
                    ]
                ],
                "term2" => [
                    "term" => [
                        'content' => "mayor vico sotto"
                    ]
                ]
            ]
        ]
    ]
]

回复

这是否意味着 Elasticsearch 无法识别短语?

这是我的整个查询: My ES Query

【问题讨论】:

  • 那是什么类型的语法?你使用 REST API 吗?
  • 你好!我正在使用 Laravel(一个基于 PHP 的框架),所以我想我正在使用官方的 Elasticsearch PHP API (github.com/elastic/elasticsearch-php)
  • content类型字段有什么类型?
  • 你好先生@Val 我编辑了帖子,你现在可以看到content 字段的映射

标签: elasticsearch


【解决方案1】:

来自docs

返回在提供的字段中包含确切术语的文档。

Terms 查询不解析查询字符串,它正在寻找完全匹配。 但是,您的字符串似乎已使用默认分析器进行了索引(我假设您的单个单词查询按预期工作)。意思是他们的内容被松散地“作为单个单词”存储。

您需要查询未分析的content.keyword 字段以获得与整个短语的完全匹配。

【讨论】:

  • 不适用于content.keyword技术先生:(还有其他可能的解决方案吗?
  • 假设字符串与条目完全匹配,它应该可以工作,但是您可以做的另一个选择是在content.keyword 上使用regexp,就像这样`".*phrase.*",这个不如术语查询高效,它只是一种解决非精确匹配的方法,正如所解释的那样,情况不应该如此。
【解决方案2】:

如果您要过滤确切的内容,请尝试将过滤器应用于未分析的字段,这将达到您的目的。 下面是代码。

"aggs" => [
    "KEYWORDS" => [
        "filters" => [
            "filters" => [
                "term1" => [
                    "term" => [
                        'content.keyword' => "mayor isko moreno"
                    ]
                ],
                "term2" => [
                    "term" => [
                        'content.keyword' => "mayor vico sotto"
                    ]
                ]
            ]
        ]
    ]
]

【讨论】:

  • 只要内容字段的值全部为小写即可,否则您需要额外的lowercase normalizer 才能实现它
  • 尝试在我的content 字段中添加.keyword,但不起作用,doc_count 仍显示 0 :(
  • 能否请您发布一些示例索引文档。
  • 好的,所以它不完全匹配。您有两个选择:1) 使用 match_phrase 或 2) 索引 3-gram shingles
  • match_phrase 绝对不区分大小写,但您需要在content 字段而不是content.keyword 上运行它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多