Cross fields +different analyzers +profile API

Столкнулась с неожиданным поведением:
Запрос dus_max-multi_match-cross field

Среди полей есть:
Brand.string analyzer1
Brand.hyphen_string analyzer1
Goodsname.string analyzer2

Есть товар 1:

{Goodsname.string : "футболка lego "
Brand.string : "lego "}

товар 2:

{Goodsname.string : "футболка "
Brand.string : "lego "}

Если query: " футболка lego"

Результат только товар1. Почему товар2 нет?

Если запрос "lego"\"футболка" результат : товар1+ товар2

В profile видно, что query обрабатывается так:

(+((+(brand.string:футболка | brand.string.hyphen_search:футболка) +(brand.string:lego | brand.string.hyphen_search:lego)) (+(goodsName:футболка | subject.value:футболка | tags.search_string:футболка) +(goodsName:lego | subject.value:lego | tags.search_string:lego)) subject.value.raw:футболка lego) )

Связано ли это с разными анализаторами?почему? :

Brand.string analyzer1
Goodsname.string analyzer2

в profile видно, что сгруппированы отдельно поиск в brand поле и goodsName, почему не был взят документ, который частично из первого и второго запросов?

Вы не могли бы показать, как воспроизвести проблему полностью, с примером как в этом ответе?

ну да. это вроде то, про это часто разоряется старик Тарнбол. Разные анализаторы дают разные ветки дизньюнкций. нагуглилось https://stackoverflow.com/a/36051941/849851 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html#_literal_cross_field_literal_and_analysis

1 Like
GET products/nms/_search
{"profile":true,
  
  "query": {
    "constant_score": {
      "query": {
        "bool": {
          "must": [
            {
              "dis_max": {
                "queries": [
                  {
                    "multi_match": {
                      "type": "cross_fields",
                      "query": "кроссовки nike",
                      "minimum_should_match": "30%",
                      "operator": "and",
                      "fields": [
                       "brand.string", 
                       "brand.string.hyphen_search", 
                        "subject.value^20",
                        "groups.value"
                        //"brand.name",
                   //     "brand.value.raw",
                       // "brand.directionName"
                      ]
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

hits : 0
profile:

>   "description": "+ConstantScore((+groups.value:кроссовки +groups.value:nike) 
> (+(brand.string:кроссовки | brand.string.hyphen_search:кроссовки)
>  +(brand.string:nike | brand.string.hyphen_search:nike))
>  (+subject.value:кроссовка +subject.value:nike)) #(ConstantScore(_type:nms))^0.0",

GET products/nms/_search
{"profile":true,
"size": 0,
"query": {
"constant_score": {
"query": {
"bool": {
"must": [
{
"dis_max": {
"queries": [
{
"multi_match": {
"type": "cross_fields",
"query": "кроссовки nike",
"minimum_should_match": "30%",
"operator": "and",
"fields": [
"brand.string",
"brand.string.hyphen_search",
"subject.value^20",
"groups.value",
"brand.name",
"brand.value.raw",
"brand.directionName"
]
}
}
]
}
}
]
}
}
}
}
}

"hits":
"total": 1946
profile: ...

"description": "+ConstantScore((+groups.value:кроссовки +groups.value:nike) (+(brand.string:кроссовки | brand.string.hyphen_search:кроссовки) +(brand.string:nike | brand.string.hyphen_search:nike)) (+(brand.directionName:кроссовка | brand.name:кроссовка | (subject.value:кроссовка)^20.0) +(brand.directionName:nike | brand.name:nike | (subject.value:nike)^20.0)) brand.value.raw:кроссовки nike) #(ConstantScore(_type:nms))^0.0"

Gist c mapping

Похоже на то :

Mikhail_Khludnev: ну да. это вроде то, про это часто разоряется старик Тарнбол. Разные анализаторы дают разные ветки дизньюнкций. нагуглилось lucene - Elasticsearch multi-match cross fields query with different query analyzers - Stack Overflow Multi-match query | Elasticsearch Guide [8.11] | Elastic

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.