Elasticsearch: поиск слов, связанных, оканчивающихся или содержащих определенный символ c - PullRequest
1 голос
/ 10 апреля 2020

Я новичок в Elasticsearch и все еще учусь этому. У меня есть индекс с именем article. У документов в индексе есть поле с именем body, в котором содержится текст статьи. Язык текстов Hindi.

I wi sh для поиска слов, связанных специальным символом hyphen(-).

Если я ищу статью по id, я получаю результаты, как показано ниже:

GET /article/_doc/<some id>

{
  "_index" : "article",
  "_type" : "_doc",
  "_id" : "<some id>",
  "_version" : 1,
  "_seq_no" : 495,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "web_source" : "<some source>",
    "web_url" : "<some url>",
    "body" : """
 ... उत्तर-पूर्व में चीन, नेपाल और भूटान, पूर्व में बांग्लादेश और म्यान्मार स्थित हैं। हिन्द महासागर में इसके दक्षिण पश्चिम में मालदीव, दक्षिण में श्रीलंका और दक्षिण-पूर्व में इंडोनेशिया से भारत की सामुद्रिक सीमा लगती है। इसके उत्तर की भौतिक सीमा हिमालय पर्वत से और दक्षिण में हिन्द महासागर से लगी हुई है। पूर्व में बंगाल की खाड़ी है तथा पश्चिम में अरब सागर हैं। ...
  """,
      "updated" : "<some date>"
  }
}

Очевидно, что поле body содержит такие слова, как दक्षिण-पूर्व и उत्तर-पूर्व. Я sh найду все такие слова.

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

GET /article/_search
{
    "query": {
        "match": {
            "body" : "उत्तर-पूर्व"
        }
    },
    "highlight" : {
        "fields" : {
            "body" : {}
        }
    }
}

Примечание: я пробовал приведенный ниже запрос без каких-либо улучшений, т.е. он возвращает 0 хитов.

POST /article/_doc/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "wildcard": {
                        "body": "*-*"
                    }
                }
            ]
        }
    }
}

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Как упомянуто в комментарии, вы используете отображение по умолчанию, которое будет использовать стандартный анализатор по умолчанию, который удалит - при индексации, следовательно, вы не получите при поиске *_*.

анализируется запрос на совпадение , в котором используется тот же анализатор, который использовался во время индекса, поэтому он также удаляет - для поисковых терминов, поэтому он дал результаты. Из того же самого выполните c запроса на совпадение:

Возвращает документы, которые соответствуют предоставленному тексту, номеру, дате или логическому значению. Предоставленный текст анализируется перед сопоставлением.

Решение : - используйте пользовательский анализатор , если вы также хотите найти _, который использует ключевой токенайзер с нижним регистром, как я проверял, и Hindi анализатор также удаляет -.

токены, сгенерированные с помощью Hindi анализатора

POST /article/_analyze --> noyte `-` removed

{
    "analyzer" : "hindi",
    "text" : "उत्तर-पूर्व"
}

{
    "tokens": [
        {
            "token": "उततर",
            "start_offset": 0,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "पुरव",
            "start_offset": 6,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

Настраиваемый анализатор по умолчанию (нижнее ключевое слово)

{
    "settings": {
        "analysis": {
            "analyzer": {
                "lowercasekeyword": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": [
                        "lowercase"
                    ]
                }
            }
        }
    }
}

Жетоны, сгенерированные с помощью вышеуказанного настраиваемого анализатора

POST articles/_analyze
{
    "analyzer" : "lowercasekeyword",
    "text" : "उत्तर-पूर्व"
}

{
    "tokens": [
        {
            "token": "उत्तर-पूर्व",
            "start_offset": 0,
            "end_offset": 11,
            "type": "word",
            "position": 0
        }
    ]
}

Важное примечание: Вы должны создать другое поле, в которое включите этот анализатор lowercasekeyword и использовать его для поиска по шаблону. Как упоминалось ранее, match запросы анализируются и не будут работать в этом поле.

0 голосов
/ 11 апреля 2020

При использовании Elasticsearch важно понимать, как ваши документы маркируются. В индексах Elasticsearch по умолчанию используется анализатор Standard , который удаляет большинство знаков препинания из документа. Это, вероятно, причина, по которой вы не можете искать дефисы. Вы можете использовать Analyze API , чтобы понять, как ваши документы разбиваются на токены.

...