У меня на интересующие поля привязан плагин русской морфологии. Маппинги на индекс выглядят следующим образом:
PUT reg-document
{
"settings" : {
"index" : {
"analysis" : {
"filter" : {
"ru_stopwords" : {
"type" : "stop",
"stopwords" : "а,без,более,бы,был,была,были,было,быть,в,вам,вас,весь,во,вот,все,всего,всех,вы,где,да,даже,для,до,его,ее,если,есть,еще,же,за,здесь,и,из,или,им,их,к,как,ко,когда,кто,ли,либо,мне,может,мы,на,надо,наш,не,него,нее,нет,ни,них,но,ну,о,об,однако,он,она,они,оно,от,очень,по,под,при,с,со,так,также,такой,там,те,тем,то,того,тоже,той,только,том,ты,у,уже,хотя,чего,чей,чем,что,чтобы,чье,чья,эта,эти,это,я,a,an,and,are,as,at,be,but,by,for,if,in,into,is,it,no,not,of,on,or,such,that,the,their,then,there,these,they,this,to,was,will,with,материть"
},
"search_synonym" : {
"type" : "synonym",
"synonyms" : [
"снилс, страховой номер индивидуального лицевого счета",
]
}
},
"analyzer" : {
"ru_search_analyzer" : {
"char_filter": [
"html_strip"
],
"filter" : [
"lowercase",
"search_synonym",
"russian_morphology",
"english_morphology",
"ru_stopwords"
],
"type" : "custom",
"tokenizer" : "standard"
},
"suggest_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"search_synonym"
]
}
}
}
}
},
"mappings" : {
"properties" : {
"uuid" : {
"type" : "text"
},
"similar_questions" : {
"type" : "text",
"analyzer" : "ru_search_analyzer"
},
"keywords" : {
"type" : "keyword"
},
"content_suggest": {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
},
"analyzer" : "ru_search_analyzer"
},
"name_suggest": {
"type": "text",
"analyzer" : "suggest_analyzer"
}
}
}
}
А также есть поисковый запрос, который ищет по интересующим нас полям:
POST reg-document/_search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"filter": [
{
"terms": {
"entity": [
"nsi"
],
"boost": 1
}
}
],
"should": [
{
"dis_max": {
"tie_breaker": 0.7,
"queries": [
{
"match": {
"content_suggest": {
"query": "севастополь",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"minimum_should_match": "2<75%",
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 0.4
}
}
},
{
"match_phrase": {
"content_suggest": {
"query": "севастополь",
"slop": 4,
"zero_terms_query": "NONE",
"boost": 0.6
}
}
}
],
"boost": 0.3
}
},
{
"dis_max": {
"tie_breaker": 0.7,
"queries": [
{
"match": {
"name_suggest": {
"query": "севастополь",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"minimum_should_match": "2<75%",
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 0.4
}
}
},
{
"match_phrase": {
"name_suggest": {
"query": "севастополь",
"slop": 2,
"zero_terms_query": "NONE",
"boost": 0.6
}
}
}
],
"boost": 0.3
}
},
{
"dis_max": {
"tie_breaker": 0.7,
"queries": [
{
"match": {
"similar_questions": {
"query": "севастополь",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"minimum_should_match": "2<75%",
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 0.4
}
}
},
{
"match_phrase": {
"similar_questions": {
"query": "севастополь",
"slop": 2,
"zero_terms_query": "NONE",
"boost": 0.6
}
}
}
],
"boost": 0.2
}
},
{
"match_phrase": {
"keywords": {
"query": "севастополь",
"slop": 1,
"zero_terms_query": "NONE",
"boost": 0.2
}
}
}
],
"adjust_pure_negative": true,
"minimum_should_match": "1",
"boost": 1
}
}
}
Пользователи начали замечать, что некоторые слова учитываются при поиске, только если менять склонение. Например:
При поиске Севастополь находит 5 документов:
И при поиске Севастополю уже 6:
Анализатор приводит все к одному и тому же токену:
GET reg-document/_analyze
{
"analyzer" : "russian_morphology",
"text" : "Севастополя"
}
Response:
{
"tokens" : [
{
"token" : "севастополь",
"start_offset" : 0,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 0
}
]
}
GET reg-document/_analyze
{
"analyzer" : "russian_morphology",
"text" : "Севастополь"
}
Response:
{
"tokens" : [
{
"token" : "севастополь",
"start_offset" : 0,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 0
}
]
}
Где я мог свернуть не туда при написании запроса?