Search 无结果在映射中,字段_all已指定索引_分析器
使用Elasticsearch,我使用自定义映射和自定义分析程序集创建了一个索引,但是我无法对_all字段进行查询搜索 我正在使用这些分析仪:Search 无结果在映射中,字段_all已指定索引_分析器,search,
elasticsearch,Search,
elasticsearch,使用Elasticsearch,我使用自定义映射和自定义分析程序集创建了一个索引,但是我无法对_all字段进行查询搜索 我正在使用这些分析仪: { "analysis": { "analyzer": { "case_insensitive": { "type": "custom", "tokenizer": "keyword", "filter": [
{
"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"
}
我希望以下四个字段中的三个将包含在所有字段中,特别是标题、副标题和评论
分析仪工作如下(使用elasticsearch中的分析仪测试进行测试):
“我非常喜欢这部电影,但是我没有看懂。”->“我非常喜欢这部电影,但是我没有看懂”
“这是一个了不起的人的故事。”->“这是一个了不起的人的故事”
我希望至少通过查询“这是一个了不起的男人的故事”来搜索,我应该能够找到文档
我做错了什么
elasticsearch是如何填充“所有”字段的
如果“标题”字段应添加到“所有”字段,使用哪些数据以及如何使用?是使用为“标题”字段选择的分析仪的输出作为_all分析仪的输入,还是使用原始数据
所有字段中的数据流如何?比如说
输入->分析器->标题->索引->分析器->全部
或
输入->分析器->标题
->指数分析仪->所有
提前谢谢你 您的映射在我看来还行。我唯一会尝试的是将其中一个字段显式设置为
include\u in\u all=true
,然后重新运行查询
根据文档,可能是因为您正在覆盖其中一个字段的默认值include_in_all
,因此它可能已更改了对象所有其他字段的默认值。看这里
文件中的相关文本如下:
通过使用默认为true的include_in_all设置,可以逐个字段控制包含在_all字段中。在对象(或根对象)上设置include_in_all会更改该对象中所有字段的默认值
更新:
我想我知道它为什么不起作用。这就是我所做的。首先,我从\u all
字段中删除了自定义分析器(因此使用标准分析器)。有了它,我可以查询并获得预期的结果。返回任何文档属性中的术语的结果,但查看。至少这证实了\u all
的一般行为是正确的。接下来,为了测试分析器,我在subtitle字段上用精确的文本进行了查询(因为它使用的是关键字分析器)。这也起了作用。然后我意识到,\u all
是一个聚合字段,然后进行分析
因此,查询应该包括所有字段中的所有文本。但同样,我们如何知道它们的聚合顺序:)
这个链接有一些信息。下面提取的相关位(来自Shay)
您不想将_all的分析器设置为关键字,_all是文档中所有其他字段的聚合,因此您基本上将整个文本聚合视为单个标记
亲爱的jrao77。谢谢你的回答。我尝试过你所说的,在对象(标题、副标题等)的所有属性(尽管它们的深度相同)中添加显式include_in_all:true,但这并没有改善结果。在映射更改后是否对文档重新编制了索引?如果不重新建立索引,查询将产生相同的结果(即使使用更新的映射)。我已经删除了索引,重新创建了索引,并重新编制了索引。谢谢,我认为你的回答有道理。我创建了一个额外的分析器,它使用空白标记器而不是关键字,并作为_all字段的索引分析器应用。看起来很好用。