elasticsearch Elasticsearch:查询具有转义字符时的不同结果
Elasticsearch如何管理查询中的转义字符 我有一个文档,其中sku字段设置为关键字elasticsearch Elasticsearch:查询具有转义字符时的不同结果,elasticsearch,magento2,elasticsearch,Magento2,Elasticsearch如何管理查询中的转义字符 我有一个文档,其中sku字段设置为关键字 { "_index": "magento2_product_1_v45", "_type": "document", "_source": { "sku": "414-123 } } 下面的搜索API给出了文档结果:sku:414-123 http://localhost:9200/magento2_product_1_v45/_search?
{
"_index": "magento2_product_1_v45",
"_type": "document",
"_source": {
"sku": "414-123
}
}
下面的搜索API给出了文档结果:sku:414-123
http://localhost:9200/magento2_product_1_v45/_search?q=sku:414-123
{
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "magento2_product_1_v45",
"_type": "document",
"_id": "1",
"_score": 0.2876821,
"_source": {
"store_id": "1",
"sku": "414-123"
}
}
]
}
http://localhost:9200/magento2_product_1_v45/_search?q=sku:414\\-123
{
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
但以下内容无法检索文档:sku:414 \-123
http://localhost:9200/magento2_product_1_v45/_search?q=sku:414-123
{
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "magento2_product_1_v45",
"_type": "document",
"_id": "1",
"_score": 0.2876821,
"_source": {
"store_id": "1",
"sku": "414-123"
}
}
]
}
http://localhost:9200/magento2_product_1_v45/_search?q=sku:414\\-123
{
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
默认情况下,Magento将转义破折号。Elasticsearch似乎将转义字符视为查询字符串的一部分。根据
您需要在查询字符串中附加带“\”的特殊字符。在您的情况下,您的应用程序将发送这两次,我担心会将第二个“\”作为字符串的一部分
您需要按如下方式修改查询
http://localhost:9200/magento2_product_1_v45/_search?q=sku:414\-123
在Elasticsearch中执行查询时,应考虑发动机罩下应用的分析仪(默认为标准分析仪)。如果您在查询词中指定值“414-123”,Elasticsearch将把该值拆分为两个不同的标记“414”和“123”,并将检索应用OR操作呈现这两个词之一的任何文档。检查“sku”字段的类型也很重要,“文本”和“关键字”类型之间存在很大差异。由于您需要搜索“414-123”(全部),此字段的类型必须是关键字,否则Elasticsearch将标记它。我以前在需要考虑破折号的文字搜索中遇到过此问题,并将查询类型切换为匹配\u短语,并将字段设置为[field]。关键字,例如
$params = [];
$params['index'] = 'the_index';
$params['type'] = 'product';
$field = 'sku.keyword';
$selected = '414-123';
$params['body']['query']['bool']['must'][] = ['match_phrase' => [$field => "$selected"]];
$client = $this->clientBuilder;
$response = $client->search($params);
请添加您的架构映射这很有意义,但为什么在使用下面的API请求时它不检索文档(Magento将此请求发送给ES)
POSThttp://localhost:9200/magento2_product_1_v45/_search?pretty
{“查询”:{“应该”:[{“匹配”:{“sku”:{“查询”:“414\\-123”,“运算符”:“或”}}}]}
Magento转义破折号,JSON转义转义字符,因此是双转义。但是ES应该能够将查询读取为“414 \-123”。我认为当传递的参数为“414 \-123”时,ES不会将查询读取为“414 \-123”。他们在单\“要使用Yes,sku的类型为关键字。我目前的问题是为什么Elasticsearch在破折号按如下方式转义时没有检索文档{“sku”:{“查询”:“414\\-123”、“运算符”:“或”}}}`>无结果{“sku”:{“查询”:“414-123”、“运算符”:“或”}}}}`>及其结果