Мне удалось найти этот другой вопрос: Использование stemmer_english в Elasticsearch , но прошло уже 3 года с тех пор, как на нем была какая-либо активность
Я пытаюсь заставить эластичный поиск игнорировать'при индексации и поиске. Например:
POST my_index/_doc/
{
"message" : "Mike's bike"
}
Я хочу иметь возможность искать этот документ с помощью «mikes», «mike's», «mike». Я посмотрел и подумал, что possessive_english
должен выполнить эту задачу, но мне не удалось получить ожидаемые результаты.
Я создал индекс с помощью
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_standard": {
"tokenizer": "standard",
"filter": [
"lowercase", "my_stemmer"
]
}
},
"filter": {
"my_stemmer":{
"type": "stemmer",
"language": "possessive_english"
}
}
}
}
}
Я протестировал анализатор с помощью
POST /my_index/_analyze
{
"analyzer": "rebuilt_standard",
"text": "Mike's bike"
}
И вот результат
{
"tokens" : [
{
"token" : "mike",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "bike",
"start_offset" : 7,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 1
}
]
}
Похоже, анализатор работает. Затем я вставил документ с:
POST my_index/_doc/
{
"message" : "Mike's bike"
}
При поиске он вернул 0 результатов
GET /my_index/_search
{
"query": {
"match": {"message": "mike"}
}
}
GET /my_index/_search
{
"query": {
"match": {"message": "mikes"}
}
}
, но
GET /my_index/_search
{
"query": {
"match": {"message": "mike's"}
}
}
вернул результаты
Кажется, что я пропускаю конфигурацию на стороне сопоставления вещей из связанного вопроса, но я не уверен, как ее установить.
Я тестировал выше с помощью kibana, но на самом деле я использую рельсы и драгоценные камни«эластичный поиск-модель», «эластичный поиск-рельсы», «эластичный поиск-постоянство» с шаблоном хранилища. Я также новичок в рельсах, так что я не знаю, если это мои конфиги с рельсами, или эластичный поиск, или оба, которые требуют работы.
Я выложу их на всякий случай
include Elasticsearch::Persistence::Repository
include Elasticsearch::Persistence::Repository::DSL
client = Elasticsearch::Client.new(url: 'http://localhost:9200', log: true)
settings index: {
number_of_shards: 1,
analysis: {
analyzer: {
custom: {
type: "custom",
tokenizer: "standard",
filter: [
"lowercase",
"english_possessive_stemmer",
]
}
},
filter: {
english_possessive_stemmer: {
type: "stemmer",
language: "possessive_english",
}
}
}
}
mappings {
indexes :icon, index: false
indexes :properties, type: 'nested' do
indexes :values
end
indexes :name
}
в контроллере
repository = Repository.new
repository.create_index!(force: true)
repository.save(json)
results = repository.search(query: { match: { name: 'Mikes' } })