Поиск ключевых слов в ElasticSearch 7.6 с пробелами - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь реализовать в ElasticSearch 7.6 поиск, основанный на названиях городов, но у меня проблема с теми словами, которые содержат пробелы, как в следующем примере:

Query: "toronto, new mexico, paris, lisbona, new york, sedro-woolley".

Это моя схема сопоставления:

mapping = {
    "mappings": {
        "properties": {
            "date": { 
                "type": "date" 
            },
            "description": { 
                "type": "text", 
                "fielddata": True 
            },
        }
    }
}

и это мой запрос:

{
    "query" : {
        "match": { "description": escaped_keywords }
    },
    "highlight" : {
        "pre_tags" : ["<match>"],
        "post_tags" : ["</match>"],
        "fields" : {
            "description" : {"number_of_fragments" : 0 }
        }
    }
}

escaped_keywords содержит экранированные предыдущие ключевые слова следующим образом: "toronto new\\ mexico paris lisbona new\\ york sedro\\-woolley"

Итак, запрос работает для одного название города и для тех с тире, но не для имени с пробелом (Нью-Йорк, Нью-Мексико), которые разделены на (Нью-Йорк, Нью-Мексико).

Я также пытался поставить скобки для городов с таким образом, пробел toronto (new mexico) paris lisbona (new york) sedro\\-woolley, но результат не меняется.

РЕДАКТИРОВАТЬ Подсветка также не работает с именами, содержащими тире. Он возвращает разделенные слова (например, [sedro, wooley] вместо [sedro-wooley])

EDIT 2 Мое намерение - сопоставить список динамических c ключевых слов (например, "Нью-Йорк", "Торонто", "Седро-Вули"), используя теги подсветки . Это образец данных:

{
    "_index": "test_stackoverflow",
    "_type": "_doc",
    "_id": "x4nKv3EBQE6DGGITWX-O",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "title": "Best places: New Mexico and Sedro-Woolley",
        "description": "This is an example text containing some cities like New York and Toronto. So, there are also Milton-Freewater and Las Vegas!"
    }
}

1 Ответ

2 голосов
/ 27 апреля 2020

Вам нужно определить пользовательский анализатор , используя фильтр символов для удаления пробелов и дефисов (-) s o, чтобы сгенерированные токены соответствовали вашим требованиям.

Индекс def

{
    "settings": {
        "analysis": {
            "char_filter": {
                "my_space_char_filter": {
                    "type": "mapping",
                    "mappings": [
                        "\\u0020=>",  -> whitespace
                        "\\u002D=>"   --> for hyphen(-)
                    ]
                }
            },
            "analyzer": {
                "splcharanalyzer": {
                    "char_filter": [
                        "my_space_char_filter"
                    ],
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase"
                    ]
                }
            }
        }
    },
    "mappings" :{
        "properties" :{
            "title" :{
                "type" : "text",
                "analyzer" : "splcharanalyzer"
            }
        }
    }
}

Токены, сгенерированные пользователем splcharanalyzer

POST myindex/_analyze

{
  "analyzer": "splcharanalyzer",
  "text": "toronto, new mexico, paris, lisbona, new york, sedro-woolley"
}

{
    "tokens": [
        {
            "token": "toronto",
            "start_offset": 0,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "newmexico",
            "start_offset": 9,
            "end_offset": 19,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "paris",
            "start_offset": 21,
            "end_offset": 26,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "lisbona",
            "start_offset": 28,
            "end_offset": 35,
            "type": "<ALPHANUM>",
            "position": 3
        },
        {
            "token": "newyork",
            "start_offset": 37,
            "end_offset": 45,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "sedrowoolley",
            "start_offset": 47,
            "end_offset": 60,
            "type": "<ALPHANUM>",
            "position": 5
        }
    ]
}

Запрос на поиск различий

{
    "query": {
        "match" : {
            "title" : {
                "query" : "sedro-woolley"
            }
        }
    }
}

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

 "hits": [
            {
                "_index": "white",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.2876821,
                "_source": {
                    "title": "toronto, new mexico, paris, lisbona, new york, sedro-woolley"
                }
            }
        ]

Поиск new или york не даст никакого результата.

{
    "query": {
        "match" : {
            "title" : {
                "query" : "york"
            }
        }
    }
}

Результат

 "hits": {
        "total": {
            "value": 0,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...