Запрос ElasticSearch не возвращает ожидаемый результат

У меня структура json, как показано ниже:

{"DocumentName":"es","DocumentId":"2","Content": [{"PageNo":1,"Text": "The full text queries enable you to search analyzed text fields such as the body of an email. The query string is processed using the same analyzer that was applied to the field during indexing."},{"PageNo":2,"Text": "The query string is processed using the same analyzer that was applied to the field during indexing."}]}

Мне нужно получить результат анализа для поля Content.Text. Для этого я создал отображение при создании индекса, оно приведено ниже:

curl -X PUT "localhost:9200/myindex?pretty" -H "Content-Type: application/json" -d"{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "filter": ["lowercase", "my_stemmer"]
                }
            },
            "filter": {
                "my_stemmer": {
                    "type": "stemmer",
                    "name": "english"
                }
            }
        }
    }
}, {
    "mappings": {
        "properties": {
            "DocumentName": {
                "type": "text"
            },
            "DocumentId": {
                "type": "keyword"
            },
            "Content": {
                "properties": {
                    "PageNo": {
                        "type": "integer"
                    },
                    "Text": "_all": {
                        "type": "text",
                        "analyzer": "my_analyzer",
                        "search_analyzer": "my_analyzer"
                    }
                }
            }
        }
    }
}
}"

Проверил созданный анализатор:

curl -X GET "localhost:9200/myindex/_analyze?pretty" -H "Content-Type: application/json" -d"{\"analyzer\":\"my_analyzer\",\"text\":\"indexing\"}"

и это дало результат:

{
  "tokens" : [
    {
      "token" : "index",
      "start_offset" : 0,
      "end_offset" : 8,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
  ]
}

Но после загрузки json в индекс, когда я попытался найти "index", он вернул 0 результатов.

res = requests.get('http://localhost:9200') 
es = Elasticsearch([{'host': 'localhost', 'port': '9200'}])
res= es.search(index='myindex', body={"query": {"match": {"Content.Text": "index"}}})

Любая помощь будет очень признательна. Заранее спасибо.

1 ответ

Решение

Игнорируйте мой комментарий. Стеммер рабочий. Попробуйте следующее:

Отображение:

curl -X DELETE "localhost:9200/myindex"

curl -X PUT "localhost:9200/myindex?pretty" -H "Content-Type: application/json" -d'
{ 
    "settings":{ 
       "analysis":{ 
          "analyzer":{ 
             "english_exact":{ 
                "tokenizer":"standard",
                "filter":[ 
                   "lowercase"
                ]
             }
          }
       }
    },
    "mappings":{ 
       "properties":{ 
          "DocumentName":{ 
             "type":"text"
          },
          "DocumentId":{ 
             "type":"keyword"
          },
          "Content":{ 
             "properties":{ 
                "PageNo":{ 
                   "type":"integer"
                },
                "Text":{ 
                   "type":"text",
                   "analyzer":"english",
                   "fields":{ 
                      "exact":{ 
                         "type":"text",
                         "analyzer":"english_exact"
                      }
                   }
                }
             }
          }
       }
    }
 }'

Данные:

curl -XPOST "localhost:9200/myindex/_doc/1" -H "Content-Type: application/json" -d'
{ 
   "DocumentName":"es",
   "DocumentId":"2",
   "Content":[ 
      { 
         "PageNo":1,
         "Text":"The full text queries enable you to search analyzed text fields such as the body of an email. The query string is processed using the same analyzer that was applied to the field during indexing."
      },
      { 
         "PageNo":2,
         "Text":"The query string is processed using the same analyzer that was applied to the field during indexing."
      }
   ]
}'

Запрос:

curl -XGET 'localhost:9200/myindex/_search?pretty' -H "Content-Type: application/json"  -d '
{ 
   "query":{ 
      "simple_query_string":{ 
         "fields":[ 
            "Content.Text"
         ],
         "query":"index"
      }
   }
}'

Возвращается ровно один документ - как и ожидалось. Я также протестировали следующие стебли, все они правильно работали с предлагаемым картографирования: применять (прилагается), тексты (текст), использование (использование).

Пример Python:

import requests
from elasticsearch import Elasticsearch

res = requests.get('http://localhost:9200')
es = Elasticsearch([{'host': 'localhost', 'port': '9200'}])
res = es.search(index='myindex', body={"query": {"match": {"Content.Text": "index"}}})

print(res)

Проверено на Elasticsearch 7.4.

Другие вопросы по тегам