使用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
提前谢谢你......
答案 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中所有其他字段的聚合,因此您基本上将整个文本聚合视为单个标记。