Как добавить определяемое пользователем поле и значение в запрос elasticsearch - PullRequest
1 голос
/ 13 июля 2020

Цель: мне нужен запрос, который добавляет поле дискриминатора для различения guish нечетких и нечетких результатов.

Рассмотрим следующие документы:

curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' -d'
{
    "index": {
        "_index": "dishes",
        "_type": "dish",
        "_id": "1"
    }
}
{
    "name": "butter chicken"
}
{
    "index": {
        "_index": "dishes",
        "_type": "dish",
        "_id": "2"
    }
}
{
    "name": "chicken burger"
}

'

Рассмотрим следующий запрос:

curl -X POST "localhost:9200/dishes/_search?pretty" -H 'Content-Type: application/json' -d'
{
    "query": {
        "bool": {
            "should": [
                {
                    "term": {
                        "name": "burger"
                    }
                },
                {
                    "fuzzy": {
                        "name": {
                            "value": "burger"
                        }
                    }
                }
            ],
            "minimum_should_match": 1,
            "boost": 1.0
        }
    }
}
'

Могу ли я получить результат с дополнительным тегом, созданным во время запроса (его нет в документе), который можно использовать для различения того, что является нечетким результатом, и тем, что является нечеткий результат.



...

"hits" : [
    {
      "_index" : "dishes",
      "_type" : "dish",
      "_id" : "2",
      "_score" : 1.3862942,
      "_source" : {
        "name" : "chicken burger"
      },

<b><em>"is_fuzzy": false</em></b>

    },
    {
      "_index" : "dishes",
      "_type" : "dish",
      "_id" : "1",
      "_score" : 0.46209806,
      "_source" : {
        "name" : "butter chicken"
      },

<b><em>"is_fuzzy": true</em></b>

    }
  ]

Поля со сценариями могли быть идеальными. Но пока не повезло.

У меня есть требование представить нечеткие результаты до нечетких результатов. Таким образом, сортировка по is_fuzzy, а затем _score гарантированно работает. (Фактический запрос более сложный.)

       sort: [
            {
                "is_fuzzy": {
                    "order": "desc"
                }
            },
            {
                "_score": {
                    "order": "desc"
                }
            }

1 Ответ

0 голосов
/ 13 июля 2020

Еще один вариант - использовать именованные запросы , но ваши term фильтры нужно будет немного переделать:

GET dishes/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "name": {
              "value": "burger",
              "_name": "not_fuzzy"
            }
          }
        },
        {
          "fuzzy": {
            "name": {
              "value": "burger",
              "_name": "fuzzy"
            }
          }
        }
      ],
      "minimum_should_match": 1,
      "boost": 1
    }
  }
}

с получением

[
  {
    "_index":"dishes",
    "_type":"dish",
    "_id":"2",
    "_score":1.3862944,
    "_source":{
      "name":"chicken burger"
    },
    "matched_queries":[         <---
      "fuzzy",
      "not_fuzzy"
    ]
  },
  {
    "_index":"dishes",
    "_type":"dish",
    "_id":"1",
    "_score":0.46209806,
    "_source":{
      "name":"butter chicken"
    },
    "matched_queries":[         <---
      "fuzzy"
    ]
  }
]
...