Elasticsearch - Stop анализатор не позволяет номер
Я пытаюсь создать поисковую утилиту, используя asticsearch 6.3.0, где любой термин может быть найден в базе данных. Я применил Stop Analyzer, чтобы исключить некоторые общие слова. Однако после того, как эта система анализатора перестала давать мне термин с числами, а также.
Например, если я ищу news24, то удаляет 24 и ищет только термин "news" во всех записях. Не уверен почему.
Ниже приведен запрос, который я использую
{
"from": 0,
"size": 10,
"explain": false,
"stored_fields": [
"_source"
],
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "news24",
"analyzer": "stop",
"fields": [
"title",
"keywords",
"url"
]
}
},
"functions": [
{
"script_score": {
"script": "( (doc['isSponsered'].value == 'y') ? 100 : 0 )"
}
},
{
"script_score": {
"script": "doc['linksCount'].value"
}
}
],
"score_mode": "sum",
"boost_mode": "sum"
}
},
"script_fields": {
"custom_score": {
"script": {
"lang": "painless",
"source": "params._source.linksArray"
}
}
},
"highlight": {
"pre_tags": [
""
],
"post_tags": [
"<\/span>"
],
"fields": {
"title": {
"type": "plain"
},
"keywords": {
"type": "plain"
},
"description": {
"type": "plain"
},
"url": {
"type": "plain"
}
}
}
}
1 ответ
Это потому stop analyzer
это просто расширение Simple Analyzer, которое использует Tokenizer в нижнем регистре, который просто разбивает термины на токены, если встречает символ, который не является letter
(конечно, также в нижнем регистре все условия).
Так что, если у вас есть что-то вроде news24
что он делает, разбивает его на news
как это встретилось 2
,
Это поведение по умолчанию stop analyzer
, Если вы намереваетесь использовать стоп-слова и по-прежнему хотите сохранять цифры в картинке, вам потребуется создать собственный анализатор, как показано ниже:
Отображение:
POST sometestindex
{
"settings":{
"analysis":{
"analyzer":{
"my_english_analyzer":{
"type":"standard",
"stopwords":"_english_"
}
}
}
}
}
Что он делает, он использует Standard Analyzer
который внутренне использует стандартный токенизатор, а также игнорирует стоп-слова.
Анализ запроса для тестирования
POST sometestindex/_analyze
{
"analyzer": "my_english_analyzer",
"text": "the name of the channel is news24"
}
Результат запроса
{
"tokens": [
{
"token": "name",
"start_offset": 4,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "channel",
"start_offset": 16,
"end_offset": 23,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "news24",
"start_offset": 27,
"end_offset": 33,
"type": "<ALPHANUM>",
"position": 6
}
]
}
Вы можете увидеть в приведенных выше жетонах, что news24
сохраняется как маркер.
Надеюсь, поможет!