【问题标题】:No results when in the mapping, the field _all has specified an index_analyzer映射时无结果,字段_all已指定index_analyzer
【发布时间】:2015-05-11 12:19:06
【问题描述】:

通过 Elasticsearch,我使用自定义映射和自定义分析器集创建了一个索引,但是我无法对 _all 字段进行查询搜索。

我正在使用这些分析器:

{
    "analysis": {
        "analyzer": {
            "case_insensitive": {
                "type": "custom",
                "tokenizer": "keyword",
                "filter": [
                    "lowercase",
                    "asciifolding"
                ],
                "char_filter": "punctuation"
            }
        },
        "char_filter": {
            "punctuation": {
                "type": "mapping",
                "mappings": [
                    ".=>\\u0020",
                    "-=>\\u0020",
                    "_=>\\u0020"
                ]
            }
        }
    }
}

还有这个映射:

{
"article": {
    "_all": {
        "enabled": true,
        "store": "yes",
        "index_analyzer": "case_insensitive",
        "search_analyzer": "case_insensitive"
    },
    "properties": {
        "title": {
            "type": "string",
            "index": "analyzed"
        },
        "subtitle": {
            "type": "string",
            "analyzer": "case_insensitive"
        },
        "comment": {
            "type": "string",
            "index": "not_analyzed"
        },
        "review": {
            "type":"string",
            "index": "not_analyzed",
            "include_in_all":false
        }
    }
}

}

然后我添加一个这样的文档:

{
    "title": "This is the story of a wonderful man.", 
    "subtitle":"A man goes on vacation in the worst place possible.",
    "comment": "I like the movie very much, however I did not undertand it.",
    "review":"Very well"
}

我希望以下 4 个字段中的 3 个应包含在 _all 中,尤其是标题、副标题和评论。

分析器工作如下(使用 elasticsearch 中的分析器测试进行测试):

“我很喜欢这部电影,但我没看懂。” -> “我很喜欢这部电影,但我没看懂”

“这是一个了不起的人的故事。” -> “这是一个了不起的人的故事”

我希望至少使用以下查询搜索 _all:“这是一个了不起的人的故事。”我应该能够找到该文件。

我做错了什么?

elasticsearch 如何填充 _all 字段?

如果字段'title'应该添加到_all字段,使用哪些数据以及如何使用?它是使用为“标题”字段选择的分析器的输出作为_all 的分析器的输入还是使用原始数据?

_all 字段的数据流向如何?例如

输入 -> 分析器 -> 标题 -> index_analysisr -> _all

输入 -> 分析器 -> 标题 -> index_analysisr -> _all

提前谢谢你...

【问题讨论】:

    标签: search elasticsearch


    【解决方案1】:

    我觉得你的映射没问题。我唯一会尝试的是将其中一个字段显式设置为include_in_all=true,然后重新运行您的查询。

    根据文档,当您覆盖其中一个字段的默认值 include_in_all 时,它可能已经更改了对象的所有其他字段。看这里_all

    文档中的相关文字如下:

    可以通过使用默认为 true 的 include_in_all 设置逐个字段地控制包含在 _all 字段中。在对象(或根对象)上设置 include_in_all 会更改该对象内所有字段的默认值。

    更新:

    我想我知道它为什么不起作用。这就是我所做的。首先,我从_all_ 字段中删除了自定义分析器(因此使用标准分析器)。有了这个,我能够查询并得到预期的结果。对于在任何文档属性中但 review 中的术语返回结果。至少这证实了_all 的一般行为是正确的。接下来为了测试分析器,我在 subtitle 字段中使用确切的文本进行了查询(因为它正在使用关键字分析器)。这也奏效了。然后我意识到_all 是一个聚合字段并然后进行了分析。

    所以查询应该包括所有字段中的所有文本才能工作。但同样,我们怎么知道它们是按什么顺序聚合的:)

    此链接_all custom analyser 有一些信息。下面提取的相关位(来自 Shay)。

    您不想将 _all 的分析器设置为关键字,_all 是文档中所有其他字段的聚合,因此您基本上将整个文本聚合视为单个标记。

    【讨论】:

    • 亲爱的 jrao77。感谢您的回答。我已经通过在对象(标题、副标题等)的所有属性(尽管它们处于同一深度级别)中明确添加 include_in_all:true 来尝试您所说的,但它并没有改善结果。
    • 您是否在映射更改后重新索引了文档?如果不重新索引,查询将产生相同的结果(即使使用更新的映射)。
    • 是的,当然。我已经删除了索引,重新创建并重新编制了索引。
    • 谢谢,我觉得你的回答很有道理。我创建了一个额外的分析器,它使用空格标记器而不是关键字,并用作 _all 字段的 index_analyzer。似乎工作正常。
    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多