Elasticsearch的copy_to探秘

众所周知es中有个_all元字段(它包含每个字段的文本副本),使用_all进行搜索的query_string和simple_query_string查询有分词搜索的场景非常好赞,不过从6.0版本已默认禁用(_all不能再为使用Elasticsearch 6.0或更高版本创建的索引配置,更多)。

要查询某个document中_all的信息则可以通过:get product/doc/1?stored_fields=_all更多

如果你还有一些这样的需求:假如我们要经常对这三个字段进行搜索,那么一种方法我们可以在must子句中使用should子句运行bool查询。这种方法写起来比较麻烦。有没有一种更好的方法呢?

而从6.7开始提供了copy_to来提高搜索的效率,其实它源于_all的。

http://xxxxxx:9200/product_shop_test
{
	"settings": {
		"number_of_shards": 1,
		"number_of_replicas": 0
	},
	"mappings": {
		"doc": {
			"properties": {
				"product_code": {
					"type": "keyword",
					"copy_to": "product_shop_code"
				},
				"shop_code": {
					"type": "keyword",
					"copy_to": "product_shop_code"
				},
				"product_shop_code": {
					"type": "text"					
				}
			}
		}
	}
}
//_bulk最后回车换行
http://xxxxxx:9200/_bulk
{"index":{"_index":"product_shop_test","_type":"doc","_id":1}}
{"shop_code":"9527","product_code":"8848"}
{"index":{"_index":"product_shop_test","_type":"doc","_id":2}}
{"shop_code":"9527","product_code":"8849"}

http://xxxxxx:9200/product_shop_test/_search
{
    "query": {
        "match_all": {}
    }
}
//返回
{
    "took": 0,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 1,
        "hits": [
            {
                "_index": "product_shop_test",
                "_type": "doc",
                "_id": "1",
                "_score": 1,
                "_source": {
                    "shop_code": "9527",
                    "product_code": "8848"
                }
            },
            {
                "_index": "product_shop_test",
                "_type": "doc",
                "_id": "2",
                "_score": 1,
                "_source": {
                    "shop_code": "9527",
                    "product_code": "8849"
                }
            }
        ]
    }
}

简单的理解,copy_to可以将它们合成一个字段,这样可以方便我们的搜索。

提问及解答环节:

1. product_shop_code好像不在_source中?

没错,它并不存在于我们文档的source里。

2. 怎样查看copy_to的内容?

maping时将store属性为true,通过查看_all的方式一样,get api中参数stored_fields来查看

"product_shop_code": {
    "type": "keyword",
      "store": true
}
http://xxxxx:9200/product_shop_test1/doc/1?stored_fields=product_shop_code

3. 可以copy_to的目标字段可以指定keyword,不能的话我上述的场景怎么破?

copy_to仅适用于全文搜索,换言之product_shop_code必须指定为text,否则影响该字段功能使用。

不用bool当然也是解的,可以指定minimum_should_match即可

{
    "query": {
        "match": {
            "product_shop_code": {
                "query": "9527 8848",
                "minimum_should_match": 2
            }
        }
    }
}

好像下面这个也可以

{
    "query": {
        "match": {
            "product_shop_code": {
                "query": "9527-8848",
                "minimum_should_match": 2
            }
        }
    }
}

没错,你已经发现了问题之所在!要自定义个分词器(可以按空格或业务不会使用的字符),否则又找到的不是你想要的!

Elasticsearch的`copy_to`字段是一种用于在索引过程中将字段值复制到另一个字段的机制。它允许您将一个或多个字段的内容复制到一个新的目标字段中,以便在搜索和分析过程中更方便地访问。 `copy_to`的原理是,在文档索引时,Elasticsearch会将指定的源字段的值复制到目标字段中。这样,当执行搜索操作时,您可以直接在目标字段上执行查询,而不必考虑源字段。这对于需要在多个字段上执行相似查询的情况非常有用。 在创建索引映射时,您可以为字段指定`copy_to`属性,指定将其值复制到目标字段。例如,假设您有一个名为`title`的源字段和一个名为`combined`的目标字段,您可以将`title`字段的内容复制到`combined`字段中: ``` PUT my_index { "mappings": { "properties": { "title": { "type": "text", "copy_to": "combined" }, "combined": { "type": "text" } } } } ``` 当您索引一个文档时,`title`字段的值将自动复制到`combined`字段中。这样,您就可以在搜索时直接对`combined`字段执行查询操作,而不必考虑`title`字段。 请注意,`copy_to`并不是实时的操作,它只在文档索引时生效。因此,对源字段进行更新不会自动触发目标字段的更新。如果您对源字段进行了更改,您需要手动重新索引文档以确保目标字段的值也得到更新。 希望这个解释对您有所帮助!如果您还有其他问题,请随时提问。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值