我一直在阅读有关属性和字段的这两个文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/properties.html
我了解特定文档中所述的目的(意味着我了解属性的用途,并且了解多字段的目的),但我并没有真正看到它们实际用途之间的区别。例如,在来自字段doc的代码段中,显示了如何定义多字段:
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
如果我将“ fields”改为“ properties”,它的工作原理是否完全一样?
答案 0 :(得分:4)
如果您在示例中将fields
替换为properties
,那么,作为Biplab said,Elasticsearch将给您一个例外:
"reason": "Failed to parse mapping [doc]: Mapping definition for [city] \
has unsupported parameters: [properties : {raw={type=keyword}}]",
properties
是什么? properties
基本上声明您将在此处发送一个复杂的JSON对象。
在您的示例中,使用properties
而不是fields
的最接近映射看起来像:
PUT my_index_with_properties
{
"mappings": {
"doc": {
"properties": {
"city": {
"properties": {
"name": {
"type": "text"
},
"name_keyword": {
"type": "keyword"
}
}
}
}
}
}
}
您将要插入的文档如下所示:
POST my_index_with_properties/doc
{
"city": {
"name": "New York",
"name_keyword": "New York"
}
}
请注意,"New York"
重复了两次。
您可以在此处使用match
进行全文查询:
POST my_index_with_properties/doc/_search
{
"query": {
"match": {
"city.name": "york"
}
}
}
或使用term
query进行精确搜索:
POST my_index_with_properties/doc/_search
{
"query": {
"term": {
"city.name_keyword": "New York"
}
}
}
请注意,我们正在查询不同的字段。
fields
有什么区别?在发布示例时,使用带有fields
的示例,我们可以发送如下所示的文档:
POST my_index/doc
{
"city": "New York"
}
您可以看到没有明显的数据重复。但是实际上,Elasticsearch的下面是为您做的重复。
现在我们可以使用city
字段进行全文搜索:
POST my_index/doc/_search
{
"query": {
"match": {
"city": "york"
}
}
}
尽管如此,它不适用于确切的搜索。以下查询将不返回任何内容,因为字段city
被标记化并小写,并且term
查询的参数不是:
POST my_index/doc/_search
{
"query": {
"term": {
"city": "New York"
}
}
}
此确切的搜索查询将起作用:
POST my_index/doc/_search
{
"query": {
"term": {
"city.keyword": "New York"
}
}
}
由于映射中的fields
,我们刚刚要求Elasticsearch将city
字段重新索引为keyword
,并且要使用此字段,我们必须键入{ {1}}。
因此,结论是,city.keyword
只是一种告诉Elasticsearch您希望它以几种不同的方式处理同一数据字段的方法。例如,当用不同语言为文本编制索引时,它可能会派上用场。
希望有帮助!
答案 1 :(得分:0)
根据Elasticsearch文档中的“字段”:
通常以不同的方式为相同的字段建立索引对于 不同的目的。这是多字段的目的。例如, 字符串字段可以映射为文本字段以进行全文搜索, 并作为用于排序或聚合的关键字字段:
考虑到上面的语句和JSON,如果要同时使用“ city”和“ keyword”作为文本,则需要在“ fields”下声明其他类型,以便像
一样进行查询。"sort": {
"city.raw": "asc"
}