Построение эффективного запроса Elasticsearch для cross_fields с нечеткостью - PullRequest
2 голосов
/ 12 марта 2020

Я знаю, что Elasticsearch не поддерживает нечеткость с типом cross_fields в запросе multi_match. У меня очень трудное время с API Elasticsearch, и поэтому мне сложно создать аналогичный запрос, который выполняет поиск по нескольким полям документа с нечетким сопоставлением строк.

У меня есть индекс под названием papers с различными такие поля, как Title, Author.FirstName, Author.LastName, PublicationDate, Journal et c ... Я хочу иметь возможность запроса со строкой, такой как «Название журнала John Doe paper title 2015 название журнала». cross_fields - это идеальный тип multi_match, но он не поддерживает нечеткость, что крайне важно для моего приложения.

Может кто-нибудь предложить разумный способ подойти к этому? Я потратил часы на поиски решений на SO и форумах Elasticsearch с небольшим успехом.

1 Ответ

1 голос
/ 12 марта 2020

Вы можете использовать поле copy_to для этого сценария. В основном вы копируете все значения из разных полей в одно новое поле (my_search_field в подробностях ниже), и в этом поле вы сможете выполнять нечеткий запрос с помощью параметра fuzziness, используя простой запрос на сопоставление .

Ниже показан пример отображения, документа и запроса:

Отображение:

PUT my_fuzzy_index
{
  "mappings": {
    "properties": {
      "my_search_field":{                    <---- Note this field
        "type": "text"
      },
      "Title":{
        "type": "text",
        "copy_to": "my_search_field"         <---- Note this 
      },
      "Author":{
        "type": "nested",
        "properties": {
          "FirstName":{
            "type":"text",
            "copy_to": "my_search_field"     <---- Note this 
          },
          "LastName":{
            "type":"text",
            "copy_to": "my_search_field"     <---- Note this 
          }
        }
      },
      "PublicationDate":{
        "type": "date",
        "copy_to": "my_search_field"        <---- Note this 
      },
      "Journal":{
        "type":"text",
        "copy_to": "my_search_field"        <---- Note this 
      }
    }
  }
}

Образец документа:

POST my_fuzzy_index/_doc/1
{
  "Title": "Fountainhead",
  "Author":[
    {
      "FirstName": "Ayn",
      "LastName": "Rand"
    }
  ],
  "PublicationDate": "2015",
  "Journal": "journal"
}

Запрос запроса :

POST my_fuzzy_index/_search
{
  "query": {
    "match": {
      "my_search_field": {                                  <---- Note this field
        "query": "Aynnn Ranaad Fountainhead 2015 journal",
        "fuzziness": 3                                      <---- Fuzzy parameter
      }
    }
  }
}

Ответ:

{
  "took" : 15,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.1027813,
    "hits" : [
      {
        "_index" : "my_fuzzy_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.1027813,
        "_source" : {
          "Title" : "Fountainhead",
          "Author" : [
            {
              "FirstName" : "Ayn",
              "LastName" : "Rand"
            }
          ],
          "PublicationDate" : "2015",
          "Journal" : "journal"
        }
      }
    ]
  }
}

Таким образом, вместо того, чтобы думать о применении нечеткого запроса к нескольким полям, вы можете вместо этого go для этого подхода. Таким образом, ваш запрос будет упрощен.

Дайте мне знать, если это поможет!

...