Отфильтровать результаты, соответствующие одному символу в поиске elasti c - PullRequest
0 голосов
/ 14 июля 2020

В моих результатах поиска elasti c результаты выдаются, даже если он соответствует одному символу. результаты выглядят странно, когда мы видим результаты с одной цифрой.

Есть ли способ отфильтровать результаты, соответствующие одной цифре / символу, через запрос DSL.

текущий запрос:

GET /attachment_index/_search
{
  "_source": [
    "user_email_id",
    "file_content_id",
    "file_name",
    "non_indexed_meta_data"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "has_child": {
            "type": "user_email_id",
            "query": {
              "match": {
                "user_email_id": "test@user.com"
              }
            },
            "inner_hits": {}
          }
        },
        {
          "match": {
            "attachment.content": {
              "query": "mark twain 3",
              "analyzer": "english", 
              "operator": "or"
            }
          }
        }
      ]
    }
  },
  "highlight": {
    "order": "score",
    "pre_tags": [
      "<strong>"
    ],
    "post_tags": [
      "</strong>"
    ],
    "fields": {
      "attachment.content": {}
    }
  },
  "size": 100
}

он дает совпадения результатов для 3, которые мне не нужны. любые мысли по фильтрации по длине без предварительной обработки перед загрузкой в ​​elasti c search?

1 Ответ

0 голосов
/ 14 июля 2020

Возможна фильтрация по длине с помощью специального анализатора. Документация Elasticsearch содержит пример того, как перестроить анализатор Engli sh, чтобы мы могли добавить туда фильтр минимальной длины, например,

PUT /attachment_index
{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_"
        },
        "english_stemmer": {
          "type":       "stemmer",
          "language":   "english"
        },
        "english_possessive_stemmer": {
          "type":       "stemmer",
          "language":   "possessive_english"
        },
        "length": {
          "type": "length",
          "min": 2
        }
      },
      "analyzer": {
        "length_english": {
          "tokenizer":  "standard",
          "filter": [
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "english_stemmer",
            "length"
          ]
        }
      }
    }
  }
}

Чтобы попробовать это:

GET attachment_index/_analyze
{
  "analyzer": "length_english",
  "text": "mark twain 3"
}

возвращает

{
  "tokens" : [
    {
      "token" : "mark",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "twain",
      "start_offset" : 5,
      "end_offset" : 10,
      "type" : "<ALPHANUM>",
      "position" : 1
    }
  ]
}

, поэтому 3 был отфильтрован по желанию. Анализатор length_english можно использовать вместо english в запросе на совпадение.

...