Elasticsearch - Stop анализатор не позволяет номер - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь создать поисковую утилиту, используяasticsearch 6.3.0, где любой термин можно искать в базе данных. Я применил Stop Analyzer, чтобы исключить некоторые общие слова. Однако после того, как эта система анализатора перестала давать мне термин с числами.

Например, если я ищу новости24, то удаляет 24 и ищет только термин «новости» во всех записях. Не уверен почему.

Ниже приведен запрос, который я использую

{
   "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 Ответ

0 голосов
/ 03 ноября 2018

Это потому, что 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 сохраняется как токен.

Надеюсь, это поможет!

...