在映射中没有结果,字段_all指定了index_analyzer

时间:2015-05-11 12:19:07

标签: search elasticsearch

使用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"
}

我希望_all中包含以下3个字段中的3个,特别是标题,副标题和注释。

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

"我非常喜欢这部电影,但是我并没有这么做。" - > "我非常喜欢这部电影,但是我并没有对它进行拍摄"

"这是一个好人的故事。" - > "这是一个精彩男人的故事"

我希望至少使用查询搜索_all:"这是一个好人的故事。"我应该能够找到该文件。

我做错了什么?

elasticsearch如何填充_all字段?

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

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

输入 - >分析仪 - >标题 - > index_analyser - > _all

输入 - >分析仪 - >标题        - > index_analyser - > _all

提前谢谢你......

1 个答案:

答案 0 :(得分:0)

您的映射对我来说没问题。我唯一要尝试的是将其中一个字段明确设置为include_in_all=true,然后重新运行查询。

根据文档,可能是因为您为其中一个字段覆盖了include_in_all的默认值,它可能已经为对象的所有其他字段更改了它。见_all

文件中的相关文字如下:

  

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

<强>更新

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

因此查询应该包含所有要工作的字段中的所有文本。但同样,我们如何知道它们汇总的顺序:)

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

  

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