正如我在评论中提到的,你想要的东西是不可能的。简而言之,您的要求是:以多种方式分析相同的数据,但将其作为单个字段进行搜索,因为这会破坏现有的应用程序。
-- body.html
-- body.email
body field ---- body.content --- all searched as "body"
...
-- body.destination
-- body.whatever
你的第一个选择是多领域其确切目的是:以多种方式分析相同的数据。问题是你无法搜索"body"
并期望ES搜索body.html
, body.email
...即使这是可能的,您也希望使用不同的分析器进行搜索。再说一次,不可能。此选项要求您更改应用程序并搜索 a 中的每个字段multi_match
或在一个query_string
.
你的第二个选择 -reincarnation of multi-fields
- 将再次不起作用,因为你不能参考body
和 ES,在后台,以匹配mail
, content
etc.
第三种选择 - 使用copy_to
- 不起作用,因为复制到另一个字段“X”意味着索引正在复制的数据将被分析为X
的分析器,这打破了您对相同数据进行不同分析的要求。
可能还有第四种选择——"path": "just_name" from multi_fields https://www.elastic.co/guide/en/elasticsearch/reference/0.90/mapping-multi-field-type.html#_accessing_fields- 乍一看应该有效。这意味着,您可以拥有 3 个多字段(电子邮件、内容、html),这三个字段都有一个body
子领域。拥有"path": "just_name"
允许您只搜索body
即使body
是多个其他字段的子字段。但这是不可能的,因为这种类型的多字段不会接受同一分析仪的不同分析仪body
.
无论哪种方式,您都需要更改您的需求中的某些内容,因为它们不会按照您想要的方式工作。
话虽这么说,我很好奇您在应用程序中使用了哪些查询。这将是一个简单的改变(是的,您需要更改您的应用程序)从查询body
查询字段body.*
in a multi_match
.
我为您提供了另一种解决方案:创建多个索引,为您的每个分析器创建一个索引body
。例如,对于mail
, content
and html
您定义三个索引:
PUT /multi_fields1
{
"mappings": {
"test": {
"properties": {
"body": {
"type": "string",
"index_analyzer": "whitespace",
"search_analyzer": "standard"
}
}
}
}
}
PUT /multi_fields2
{
"mappings": {
"test": {
"properties": {
"body": {
"type": "string",
"index_analyzer": "standard",
"search_analyzer": "standard"
}
}
}
}
}
PUT /multi_fields3
{
"mappings": {
"test": {
"properties": {
"body": {
"type": "string",
"index_analyzer": "keyword",
"search_analyzer": "standard"
}
}
}
}
}
你会发现他们都有相同的type
和相同的字段名称 -body
- 但不同index_analyzer
s。然后定义一个别名:
POST _aliases
{
"actions": [
{"add": {
"index": "multi_fields1",
"alias": "multi"}},
{"add": {
"index": "multi_fields2",
"alias": "multi"}},
{"add": {
"index": "multi_fields3",
"alias": "multi"}}
]
}
将您的别名命名为与当前索引相同的名称。应用程序不需要更改,它将使用相同的名称进行索引搜索,but该名称不会指向索引,而是指向别名,而别名又引用您的多个索引。需要改变的是如何索引文档,因为html
文件需要进去multi_fields1
例如,索引email
文档需要索引multi_fields2
指数等
无论您找到/选择哪种解决方案,您的需求都需要改变,因为您想要的方式是不可能的。