elasticsearch Elasticsearch:查询具有转义字符时的不同结果,elasticsearch,magento2,elasticsearch,Magento2" /> elasticsearch Elasticsearch:查询具有转义字符时的不同结果,elasticsearch,magento2,elasticsearch,Magento2" />

elasticsearch Elasticsearch:查询具有转义字符时的不同结果

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?

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?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”、“运算符”:“或”}}}}`>及其结果