В настоящее время я пытаюсь создать анализатор, который будет соответствовать части запроса. Основной вариант использования - это термин «трехмерная маммограмма», по какой-то причине использование моего анализатора автозаполнения ниже не дает результатов. После удаления опции «оператор»: «И» эластичный элемент начал возвращать результаты, но все же ожидаемые результаты по какой-то причине имеют меньшую оценку.

Вот настройки и сопоставления для моего индекса:

КАРТЫ:

{
    "search-term": {
        "properties": {
            "careNeedCode": {
                "type": "text"
            },
            "careNeedType": {
                "type": "text"
            },
            "term": {
                "type": "text",
                "analyzer": "autocomplete",
                "search_analyzer": "search_term_search"
            }
        }
    }
}

НАСТРОЙКИ:

{
  "search-term_20210209072957" : {
    "settings" : {
      "index" : {
        "number_of_shards" : "5",
        "provided_name" : "search-term_20210209072957",
        "creation_date" : "1612877398055",
        "analysis" : {
          "filter" : {
            "case_transition_filter" : {
              "split_on_numerics" : "true",
              "type" : "word_delimiter",
              "preserve_original" : "true",
              "stem_english_possessive" : "false"
            },
            "autocomplete_filter" : {
              "type" : "edge_ngram",
              "min_gram" : "2",
              "max_gram" : "15"
            },
            "hyphen-filter" : {
              "pattern" : "-",
              "type" : "pattern_replace",
              "replacement" : " "
            }
          },
          "analyzer" : {
            "autocomplete" : {
              "filter" : [ "case_transition_filter", "lowercase", "hyphen-filter", "autocomplete_filter" ],
              "type" : "custom",
              "tokenizer" : "keyword"
            },
            "search_term_search" : {
              "type" : "standard"
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "kUJ1Wxt5StWI7SVzRkWEFg",
        "version" : {
          "created" : "6080099"
        }
      }
    }
  }
}

Как видите, я использую два разных анализатора - автозаполнение для индексации и стандартный для поиска.

Из моего бэкэнда я попадаю в эластичный индекс с этими двумя запросами соответствия, заключенными в запрос типа bool:

{
  "bool" : {
    "should" : [
      {
        "match" : {
          "term" : {
            "query" : "3d mammogram",
            "operator" : "AND",
            "analyzer" : "keyword",
            "fuzziness" : "1",
            "prefix_length" : 1,
            "max_expansions" : 50,
            "fuzzy_transpositions" : true,
            "lenient" : false,
            "zero_terms_query" : "NONE",
            "auto_generate_synonyms_phrase_query" : true,
            "boost" : 2.0
          }
        }
      },
      {
        "match" : {
          "term" : {
            "query" : "3d mammogram",
            "operator" : "AND",
            "fuzziness" : "1",
            "prefix_length" : 1,
            "max_expansions" : 50,
            "fuzzy_transpositions" : true,
            "lenient" : false,
            "zero_terms_query" : "NONE",
            "auto_generate_synonyms_phrase_query" : true,
            "boost" : 1.0
          }
        }
      }
    ],
    "adjust_pure_negative" : true,
    "minimum_should_match" : "1",
    "boost" : 1.0
  }
}

Оба подобных запроса не дают результатов, но после удаления «оператора»: «И» из второго запроса я начинаю получать хорошие результаты, но не те, которых я ожидал. Вот результаты второго запроса:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 93,
    "max_score" : 20.951433,
    "hits" : [
      {
        "_index" : "search-term_20210209072957",
        "_type" : "search-term",
        "_id" : "J678hncB27Dy7czkEFix",
        "_score" : 20.951433,
        "_source" : {
          "id" : null,
          "careNeedCode" : "12000149",
          "careNeedType" : "diagnostic procedures",
          "term" : "Routine mammogram"
        }
      },
      {
        "_index" : "search-term_20210209072957",
        "_type" : "search-term",
        "_id" : "d_38hncB1Ig9AX9KE_nw",
        "_score" : 19.059473,
        "_source" : {
          "id" : null,
          "careNeedCode" : "12001178",
          "careNeedType" : "treatment procedures",
          "term" : "Mammogram"
        }
      },
      {
        "_index" : "search-term_20210209072957",
        "_type" : "search-term",
        "_id" : "Ka78hncB27Dy7czkEFix",
        "_score" : 18.515629,
        "_source" : {
          "id" : null,
          "careNeedCode" : "12000149",
          "careNeedType" : "diagnostic procedures",
          "term" : "Screening mammogram"
        }
      },
      {
        "_index" : "search-term_20210209072957",
        "_type" : "search-term",
        "_id" : "df38hncB1Ig9AX9KE_nw",
        "_score" : 18.515629,
        "_source" : {
          "id" : null,
          "careNeedCode" : "12001178",
          "careNeedType" : "treatment procedures",
          "term" : "Diagnostic mammogram"
        }
      },
      {
        "_index" : "search-term_20210209072957",
        "_type" : "search-term",
        "_id" : "dv38hncB1Ig9AX9KE_nw",
        "_score" : 18.515629,
        "_source" : {
          "id" : null,
          "careNeedCode" : "12001178",
          "careNeedType" : "treatment procedures",
          "term" : "Digital mammogram"
        }
      },
      {
        "_index" : "search-term_20210209072957",
        "_type" : "search-term",
        "_id" : "Kq78hncB27Dy7czkEFix",
        "_score" : 18.480751,
        "_source" : {
          "id" : null,
          "careNeedCode" : "12000149",
          "careNeedType" : "diagnostic procedures",
          "term" : "Screening 3D mammogram"
        }
      },
      {
        "_index" : "search-term_20210209072957",
        "_type" : "search-term",
        "_id" : "ef38hncB1Ig9AX9KE_nw",
        "_score" : 18.376223,
        "_source" : {
          "id" : null,
          "careNeedCode" : "12001178",
          "careNeedType" : "treatment procedures",
          "term" : "Diagnostic 3D mammogram"
        }
      },
      {
        "_index" : "search-term_20210209072957",
        "_type" : "search-term",
        "_id" : "eP38hncB1Ig9AX9KE_nw",
        "_score" : 17.930023,
        "_source" : {
          "id" : null,
          "careNeedCode" : "12001178",
          "careNeedType" : "treatment procedures",
          "term" : "Mammography"
        }
      },
      {
        "_index" : "search-term_20210209072957",
        "_type" : "search-term",
        "_id" : "KK78hncB27Dy7czkEFix",
        "_score" : 17.287262,
        "_source" : {
          "id" : null,
          "careNeedCode" : "12000149",
          "careNeedType" : "diagnostic procedures",
          "term" : "Screening mammography"
        }
      },
      {
        "_index" : "search-term_20210209072957",
        "_type" : "search-term",
        "_id" : "N5H8hncBQ3Qj2rWbFQs5",
        "_score" : 17.287262,
        "_source" : {
          "id" : null,
          "careNeedCode" : "12002850",
          "careNeedType" : "condition",
          "term" : "Abnormal mammography"
        }
      }
    ]
  }
}

Как видите, результаты, содержащие «трехмерную маммограмму», намного ниже результатов, в которых есть только «маммограмма». Я не уверен, что мне здесь не хватает.

0
Aethernite 19 Май 2021 в 19:27

1 ответ

Лучший ответ

На основе сопоставления индекса и настроек токены, созданные для "Screening 3D mammogram", будут

{
  "tokens": [
    {
      "token": "sc",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "scr",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "scre",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "scree",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "screen",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "screeni",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "screenin",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "screening",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "screening ",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "screening 3",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "screening 3d",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "screening 3d ",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "screening 3d m",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "screening 3d ma",
      "start_offset": 0,
      "end_offset": 22,
      "type": "word",
      "position": 0
    },
    {
      "token": "sc",
      "start_offset": 0,
      "end_offset": 9,
      "type": "word",
      "position": 0
    },
    {
      "token": "scr",
      "start_offset": 0,
      "end_offset": 9,
      "type": "word",
      "position": 0
    },
    {
      "token": "scre",
      "start_offset": 0,
      "end_offset": 9,
      "type": "word",
      "position": 0
    },
    {
      "token": "scree",
      "start_offset": 0,
      "end_offset": 9,
      "type": "word",
      "position": 0
    },
    {
      "token": "screen",
      "start_offset": 0,
      "end_offset": 9,
      "type": "word",
      "position": 0
    },
    {
      "token": "screeni",
      "start_offset": 0,
      "end_offset": 9,
      "type": "word",
      "position": 0
    },
    {
      "token": "screenin",
      "start_offset": 0,
      "end_offset": 9,
      "type": "word",
      "position": 0
    },
    {
      "token": "screening",
      "start_offset": 0,
      "end_offset": 9,
      "type": "word",
      "position": 0
    },
    {
      "token": "ma",
      "start_offset": 13,
      "end_offset": 22,
      "type": "word",
      "position": 3
    },
    {
      "token": "mam",
      "start_offset": 13,
      "end_offset": 22,
      "type": "word",
      "position": 3
    },
    {
      "token": "mamm",
      "start_offset": 13,
      "end_offset": 22,
      "type": "word",
      "position": 3
    },
    {
      "token": "mammo",
      "start_offset": 13,
      "end_offset": 22,
      "type": "word",
      "position": 3
    },
    {
      "token": "mammog",
      "start_offset": 13,
      "end_offset": 22,
      "type": "word",
      "position": 3
    },
    {
      "token": "mammogr",
      "start_offset": 13,
      "end_offset": 22,
      "type": "word",
      "position": 3
    },
    {
      "token": "mammogra",
      "start_offset": 13,
      "end_offset": 22,
      "type": "word",
      "position": 3
    },
    {
      "token": "mammogram",
      "start_offset": 13,
      "end_offset": 22,
      "type": "word",
      "position": 3
    }
  ]
}

Нет токена для 3d. Это потому, что вы взяли "tokenizer" : "keyword" за анализатор autocomplete. Вам необходимо изменить сопоставление индекса и изменить tokenizer с keyword на standard

Измененное отображение индекса будет

"analyzer" : {
            "autocomplete" : {
              "filter" : [ "case_transition_filter", "lowercase", "hyphen-filter", "autocomplete_filter" ],
              "type" : "custom",
              "tokenizer" : "standard"       // note this
            },

Вам нужно снова переиндексировать данные с помощью этого нового сопоставления индекса.


Добавление рабочего примера с данными индекса, сопоставлением индекса, поисковым запросом и результатом поиска

Отображение индекса:

{
  "settings": {
    "analysis": {
      "filter": {
        "case_transition_filter": {
          "split_on_numerics": "true",
          "type": "word_delimiter",
          "preserve_original": "true",
          "stem_english_possessive": "false"
        },
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": "2",
          "max_gram": "15"
        },
        "hyphen-filter": {
          "pattern": "-",
          "type": "pattern_replace",
          "replacement": " "
        }
      },
      "analyzer": {
        "autocomplete": {
          "filter": [
            "case_transition_filter",
            "lowercase",
            "hyphen-filter",
            "autocomplete_filter"
          ],
          "type": "custom",
          "tokenizer": "standard"           // note this
        },
        "search_term_search": {
          "type": "standard" 
        }
      }
    },
    "max_ngram_diff": 20
  },
  "mappings": {
    "properties": {
      "term": {
        "type": "text",
        "analyzer": "autocomplete",
        "search_analyzer": "search_term_search"
      }
    }
  }
}

Сгенерированные токены будут включать как "3d", так и "mammogram".

Данные индекса:

{
  "term": "Screening mammogram"
}
{
  "term": "Diagnostic 3D mammogram"
}
{
  "term": "Mammography"
}

Поисковый запрос:

{
  "query": {
    "match": {
      "term": {
        "query": "3D mammogram",
        "operator": "and"
      }
    }
  }
}

Результат поиска:

"hits": [
      {
        "_index": "67607194",
        "_type": "_doc",
        "_id": "4",
        "_score": 1.4572026,
        "_source": {
          "term": "Diagnostic 3D mammogram"
        }
      }
    ]
1
ESCoder 19 Май 2021 в 17:06