В настоящее время я пытаюсь создать анализатор, который будет соответствовать части запроса. Основной вариант использования - это термин «трехмерная маммограмма», по какой-то причине использование моего анализатора автозаполнения ниже не дает результатов. После удаления опции «оператор»: «И» эластичный элемент начал возвращать результаты, но все же ожидаемые результаты по какой-то причине имеют меньшую оценку.
Вот настройки и сопоставления для моего индекса:
КАРТЫ:
{
"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"
}
}
]
}
}
Как видите, результаты, содержащие «трехмерную маммограмму», намного ниже результатов, в которых есть только «маммограмма». Я не уверен, что мне здесь не хватает.
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"
}
}
]
Похожие вопросы
Новые вопросы
elasticsearch
Elasticsearch - это поисковая система с открытым исходным кодом (Apache 2), распределенная, RESTful, основанная на Lucene.