У меня есть JsonObjects, которые я ищу в Elasticsearch из приложения Java, используя Java API для построения searchQueries. Объекты содержат поле под названием «такое», которое содержит searchString, с которым должен быть найден JsonObject, например простой поисковой строкой будет «STVBBM160A». Кроме обычных символов aZ 0-9 searchString также может выглядеть следующим образом: «STV-157ABR», «FG/42-W3» или «DDM000.074.6652»Как создать Elasticsearch-Query с функциями startWith и специальными символами
Поиск должен возвращать результаты уже тогда, когда только первые символы помещаются в поле поиска, которое оно выполняет для поиска типа «FG/42»
Моя проблема: поиск иногда не возвращает результатов вообще, но когда последний символ вводится, он находит правильное документ.
Что я пытался: сначала я хотел использовать WildcardQuery, где запрос был бы «typedStuff *», но WildcardQuery не возвращал никаких результатов вообще, как только я набирал что-либо, кроме * (Он работал для других searchFields с другими значениями)
Теперь я использую QueryStringQuery, который также принимает ввод и помещает символ * в конец. Убегая QueryString, я могу искать строки, такие как «F-G/42» и т. Д., Но поиск «DDM000.074.6652» не возвращает никаких результатов, пока elasticsearch не проведет всю строку для поиска. Кроме того, когда я набираю «STV», все результаты с «STV-xxxxx» (содержащие «-» после STV) возвращаются, но не объект с «STVBBM160A», снова до тех пор, пока вся строка не будет указана для поиска (без отображения любые результаты Inbetween как только SearchString является «STVB»)
Это запрос, я использую прямо сейчас:
{
"size": 1000,
"min_score": 1,
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "MY_DATA_TYPE",
"fields": [
"doc.db_doc_type"
]
}
},
{
"query_string": {
"query": "MY_SPECIFIC_TYPE",
"fields": [
"doc.db_doc_specific"
]
}
}
],
"should": {
"query_string": {
"query": "STV*",
"fields": [
"doc.such"
],
"boost": 3,
"escape": true
}
}
}
}
}
Это старый запрос с WildCardQuery, который не возвращает результаты отсутствуют, если нет запросаString, но *:
{
"size": 50,
"min_score": 1,
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "MY_DATA_TYPE",
"fields": [
"doc.db_doc_type"
]
}
},
{
"query_string": {
"query": "MY_SPECIFIC_TYPE",
"fields": [
"doc.db_doc_specific"
]
}
}
],
"should": {
"wildcard": {
"doc.such": {
"wildcard": "STV*",
"boost": 3
}
}
}
}
}
}
При использовании PrefixQuery, поиск также не возвращает никаких результатов вообще (с и без *):
{
"size": 50,
"min_score": 1,
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "MY_DATA_TYPE",
"fields": [
"doc.db_doc_type"
]
}
},
{
"query_string": {
"query": "MY_SPECIFIC_TYPE",
"fields": [
"doc.db_doc_specific"
]
}
}
],
"should": {
"prefix": {
"doc.such": {
"prefix": "HSTKV*",
"boost": 3
}
}
}
}
}
}
Как этот запрос может быть изменен для достижения цели получения всех результатов, начиная с указанной строкой, независимо от того, если Поле doc.such также содержит числа или специальные символы, такие как «_» или «.». или "/" ?
Заранее спасибо
Этот ответ должен помочь: http://stackoverflow.com/questions/30666371/how-to-wisely-combine-shingles-and -edgengram-to-обеспечить-flexible-full-text-searc (подсказка: вам нужно использовать токенизатор edgeNGram вместо использования префикса и подстановочных запросов) – Val
Хорошо, поэтому мне нужно будет установить анализатор для поля «такой ». Будем искать «How-to» ;-) Спасибо за ваш комментарий – user2122552
Время, позволяющее, я дам ответ на этот вопрос ;-) – Val