2016-02-23 6 views
1

Это мой кодПочему синонимы не работают в этом примере

curl -XPUT "http://localhost:9200/my_index" -d ' 
{ 
"settings" : { 
"analysis" : { 
"filter" : { 
"my_synonym_filter" : { 
"type" : "synonym", 
"synonyms" : [ 
"luck,love" 
] 
} 
}, 
"analyzer" : { 
" my_synonym_filter " : { 
"tokenizer" : "standard", 
"filter" : [ 
"lowercase", 
"my_synonym_filter" 
] 
}}}}}' 


curl -XPUT "http://localhost:9200/my_index/_mapping/doc?pretty" -d ' 
{ 
"properties" : { 
"description" : { 
"type" : "string", 
"fields" : { 
"ss" : { 
"type" : "string", 
"analyzer" : " my_synonym_filter " 
}}}}}' 


curl -XPUT "http://localhost:9200/my_index/doc/1" -d ' 
{ 
"description" : "luck is the best in the world" 
} 
' 


curl -XPUT "http://localhost:9200/my_index/doc/2" -d ' 
{ 
"description" : "luck is just wonderful" 
} 
' 

, как вы видите, я создал два синонимы слова luck и love с помощью пользовательского анализатора

но когда я сделать этот запрос

curl -XGET "http://localhost:9200/my_index/_search?pretty" -d ' 
{ 
"query" : { 
"match" : { 
"description" : "love" 
} 
} 
} 
' 

Я не получил никаких результатов, хотя любовь является синонимом удачи

почему? что не так с моим кодом?

+0

ли вы решить вашу проблему в конце концов? – CrnaStena

+0

@CrnaStena да чем вы, ваше решение работает –

+0

Отлично. Не возражаете ли вы продвигать и/или отмечать это как ответ? – CrnaStena

ответ

0

Я согласен с @BrookeB, но хотел бы добавить еще две вещи:

  1. Ваш фильтр и анализатор имеет такое же имя, которое может ввести в заблуждение. Я переименовал анализатор в «my_analyzer»
  2. Если вы определяете multi_field, то объявляйте это как таковое.

Вот полный пример, который работает для меня:

# combined settings and mappings in one call 
curl -XPUT "http://localhost:9200/my_index3" -d ' 
{ 
    "settings" : 
    { 
     "analysis" : 
     { 
      "filter" : 
      { 
       "my_synonym_filter" : 
       { 
        "type" : "synonym", 
        "synonyms" : [ "luck,love" ] 
       } 
      }, 
      "analyzer" : 
      { 
       "my_analyzer" : 
       { 
        "tokenizer" : "standard", 
        "filter" : [ 
         "lowercase", 
         "my_synonym_filter" 
        ] 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "doc": { 
      "properties" : { 
       "description" : { 
        "type" : "multi_field", 
        "fields" : { 
         "ss" : { 
          "type" : "string", 
          "analyzer": "my_analyzer" 
         } 
        } 
       } 
      }   
     } 
    } 
}' 

# check the analyzer 
curl -XGET "http://localhost:9200/my_index3/_analyze?analyzer=my_analyzer&pretty" -d 'luck is the best in the world' 

# doc 1 
curl -XPUT "http://localhost:9200/my_index3/doc/1" -d ' 
{ 
"description.ss" : "luck is the best in the world" 
} 
' 

# doc 2, you can put to the property field 
curl -XPUT "http://localhost:9200/my_index3/doc/2" -d ' 
{ 
"description.ss" : "luck is just wonderful" 
} 
' 

# doc 3, you can put directly to the property, but... 
curl -XPUT "http://localhost:9200/my_index3/doc/3" -d ' 
{ 
"description" : "love conquors all" 
} 
' 

# gets no documents 
curl -XPOST "http://localhost:9200/my_index3/_search?pretty" -d ' 
{ 
"query" : { 
"match" : { 
"description" : "love" 
} 
} 
} 
' 

# gets all 3 documents 
curl -XPOST "http://localhost:9200/my_index3/_search?pretty" -d ' 
{ 
"query" : { 
"match" : { 
"description.ss" : "love" 
} 
} 
} 
' 
0

Похоже, что вы создали «описание» как многопользовательское поле в своем сопоставлении и только применили свой собственный анализатор к части «ss».

Попробуйте выполнить тот же запрос в поле "description.ss", чтобы узнать, получили ли вы ожидаемые результаты.

+1

Также удалите пробелы в имени анализатора (например, «my_synonym_filter» вместо «my_synonym_filter»), поскольку это может создать нежелательные ошибки. – Val

Смежные вопросы