Удалите стоп-слова при запросе с помощью запроса GET в Elasticsearch

Я пытаюсь реализовать Stop Token Filter в индексе Elasticsearch. Я использую код, взятый из здесь.

PUT /test1
{
"settings": {
    "analysis": {
        "filter": {
            "my_stop": {
                "type":       "stop",
                "stopwords":  "_english_"
            }

        }
    }
}
} 

Мои данные хранятся в формате JSON, и у меня есть поле с именем Ингредиенты, которое содержит остановленные слова. Я хочу выполнить поиск по всему индексу (содержащему почти 80 тыс. записей) о 100 наиболее часто встречающихся значениях в теге Ингредиенты. Запрос, который я использую для получения результатов,

GET test1/_search?size=0&pretty
{
"aggs": {
"genres": {
  "terms": {
    "field": "Ingredients",
    "size": 100,
    "exclude": "[0-9].*"
  }
}
}
}

Мне нужно исключить из него числа, для которых я использую exclude. Но применение вышеуказанного запроса с использованием Kibana не удаляет Stop Words и сохраняет их отображение при запросе ответа. Согласно документации, он должен удалять остановленные слова, но этого не происходит. Я не могу найти причину, так как я новичок в Elasticsearch. Пожалуйста, помогите мне разобраться. Я использую elasticsearch-7.3.1 и Kibana-7.3.1. Я работаю над этим около двух дней, но ни один из методов не работает. Спасибо! Любая помощь могла бы быть полезна.

Если я попытаюсь использовать этот способ, он сработает, но при размещении запроса GET в соответствии с методом, определенным выше, он вообще не работает.

POST test1/_analyze
{
 "analyzer": "my_stop",
 "text": "House of Dickson<br> corp"
 }

Мое сопоставление

    {
      "recipe_test" : {
"aliases" : { },
"mappings" : {
  "properties" : {
    "Author" : {
      "properties" : {
        "additionalInfo" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "description" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "eval" : {
          "type" : "boolean"
        },
        "url" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "value" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    },
    "Category" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "Channel" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "Cousine" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "Ingredients" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      },
      "fielddata" : true
    },
    "Keywords" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "MakingMethod" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "Publication" : {
      "properties" : {
        "additionalInfo" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "eval" : {
          "type" : "boolean"
        },
        "published" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "url" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "value" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    },
    "Rating" : {
      "properties" : {
        "bestRating" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "ratingCount" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "ratingValue" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "worstRating" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    },
    "Servings" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "Timings" : {
      "properties" : {
        "cookTime" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "prepTime" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "totalTime" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    },
    "Title" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "description" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "recipe_url" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    }
  }
},
"settings" : {
  "index" : {
    "number_of_shards" : "1",
    "provided_name" : "recipe_test",
    "creation_date" : "1567443878756",
    "analysis" : {
      "filter" : {
        "english_stop" : {
          "type" : "stop",
          "stopwords" : "_english_"
        }
      },
      "analyzer" : {
        "rebuilt_stop" : {
          "filter" : [
            "asciifolding",
            "lowercase",
            "english_stop"
          ],
          "tokenizer" : "standard"
        }
      }
    },
    "number_of_replicas" : "1",
    "uuid" : "K-FrOyc6QlWokGQoN6HxCg",
    "version" : {
      "created" : "7030199"
    }
  }
}

} }

Мои примеры данных

{
"recipe_url": "http1742637/bean-and-pesto-mash",
"Channel": "waqas",
 "recipe_id":"31",
"Title": "Bean & pesto mash",
"Rating": {
    "ratingValue": "4.625",
    "bestRating": "5",
    "worstRating": "1",
    "ratingCount": "8"
},
"Timings": {
    "cookTime": "PT5M",
    "prepTime": "PT5M",
    "totalTime": "PT10M"
},
"Author": {
    "eval": false,
    "value": "dfgkkdfgdfgfmes",
    "url": "https://www.example.com/",
    "additionalInfo": "Recipe from Good Food magazine, ",
    "description": "Substitute potatoes with pulses for a healthy alternative mash with a chunky texture",
    "published": "November 2011"
},
"Publication": {
    "eval": false,
    "value": "",
    "url": "",
    "additionalInfo": "",
    "published": ""
},
"Nutrition": "per serving",
"NutritionContents": {
    "kcal": "183",
    "fat": "5g",
    "saturates": "1g",
    "carbs": "25g",
    "sugars": "3g",
    "fibre": "7g",
    "protein": "11g",
    "salt": "0.84g"
},
"SkillLevel": "Easy",
"Ingredients": [
   "drizzle", "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" 

 ],
"MakingMethod": [
    "Heat the oil in a large saucepan. Add the beans and cook for 3-4 mins until hot through. Lightly mash with a potato masher for a chunky texture. Stir through the pesto and season. To serve, drizzle with a little olive oil, if you like."
],
"Keywords": [
    "Cannellini bean",
    "Cannellini beans",
    "Mash",
    "Beans",
    "Super healthy",
    "Pulses",
    "5-a-day",
    "Low fat",
    "Diet",
    "Dieting",
    "Side dish",
    "Bangers and mash",
    "Sausage and mash",
    "Texture",
    "Fireworks",
    "Pesto",
    "Easy",
    "Vegetarian",
    "Healthy",
    "Bonfire Night"
],
"Category": [
    "Side dish",
    "Dinner"
],
"Cousine": "British",
"Servings": "Serves 4"

}


person Jamshaid    schedule 02.09.2019    source источник


Ответы (1)


Нет простого способа сделать это.

Вариант 1

Включите fielddata для поля text, к которому вы применили правильный анализатор. Что-то вроде этого:

{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_" 
        }
      },
      "analyzer": {
        "rebuilt_stop": {
          "filter": [
              "asciifolding",
              "lowercase",
              "english_stop"
            ],
            "tokenizer": "standard"
        }
      }
    }
  },
  "mappings": {
    "properties": {
        "Ingredients": {
            "type": "text",
            "analyzer": "rebuilt_stop",
            "fielddata": true
        }
    }
  }
}

А затем вы запускаете свою агрегацию terms. Недостатки: он может использовать много памяти из-за использования полевых данных< /а>.

Вариант 2

Используйте API векторов терминов. Поскольку вас интересуют наиболее часто используемые «значения»/«термины» в поле Ingredients, вы можете вызвать этот API для одного документа в индексе и получить общую частоту терминов для каждого термина в этом конкретном документе. Недостаток: вам нужно указать определенный идентификатор документа, и в ответ будут возвращены только термины в этом документе.

Что-то вроде этого:

GET /test/_termvectors/1
{
  "fields" : ["Ingredients"],
  "offsets" : false,
  "payloads" : false,
  "positions" : false,
  "term_statistics" : true,
  "field_statistics" : false
}

Вариант 3

Наверное, самый уродливый. Что-то около этих строк: Elasticsearch: индексировать поле с ключевым словом токенизатор, но без стоп-слов

Преимущество: не использует fielddata (память кучи). Недостаток: вам придется вручную определять стоп-слова в определении char_filter.

person Andrei Stefan    schedule 03.09.2019
comment
Пожалуйста, опубликуйте точное сопоставление вашего индекса (GET /your_index_name). - person Andrei Stefan; 03.09.2019
comment
Как я и подозревал: на поле Ingredients не установлен анализатор:"Ingredients" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } }, "fielddata" : true}. Посмотрите на мое сопоставление в ответе, чтобы увидеть, как должен быть установлен анализатор в вашем индексе. Вам нужно создать новый индекс с обновленным сопоставлением, снова проиндексировать документы и попробовать еще раз. - person Andrei Stefan; 03.09.2019
comment
если я создам индекс после использования вашего индекса, он создаст тот же результат, который я уже опубликовал. Нужно ли мне выполнять какие-либо другие задачи поверх него? - person Jamshaid; 03.09.2019
comment
Тогда вы, должно быть, делаете что-то не так... Вы проверили мой точный индекс? Какие образцы данных вы использовали? - person Andrei Stefan; 03.09.2019
comment
Какое стоп-слово не было удалено? - person Andrei Stefan; 03.09.2019
comment
или,и,и т.д. не были удалены - person Jamshaid; 03.09.2019
comment
Я добавил примеры данных в вопрос. Пожалуйста, посмотрите - person Jamshaid; 03.09.2019
comment
Я не вижу здесь стоп-слова: "Ingredients": [ "drizzle", "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" , "Asparagus" ] - person Andrei Stefan; 03.09.2019
comment
это просто образец. Я вставляю данные, используя bulk api, и записей больше 80 000. - person Jamshaid; 03.09.2019