2016-08-03 2 views
1

Я пытаюсь найти предложение, состоящее из слова с апострофом. Так, в текстеЭластик не находит слово с апострофом (')

Если вы спросите иностранцев назвать некоторые типично английские блюда, они , вероятно, говорят, рыба и чипсы, а затем остановиться. Это неутешительно, но верно, что в Британии нет традиции питания в ресторанах , потому что наша пища не поддается такой подготовке. Британская кулинария находится в доме, где можно дождаться блюд до совершенства. Так что трудно найти хороший английский ресторан с разумными ценами

Я пытаюсь найти

найти это разочаровывает, но верно, что нет никакой традиции в британии еды в ресторанах , потому что наша пища не

создать запрос

{ 
"_index": "liza_index", 
"_type": ".percolator", 
"_id": "1594", 
"_version": 37, 
"found": true, 
"_source": { 
    "query": { 
     "bool": { 
      "minimum_should_match": 1, 
      "should": { 
       "span_or": { 
        "clauses": [{ 
         "span_near": { 
          "in_order": true, 
          "clauses": [{ 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "it" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "is" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "disappointing" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "but" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "true" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "that" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "there" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "is" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "no" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "tradition" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "in" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "britain" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "of" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "eating" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "in" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "restaurants" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "because" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "our" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "food" 
             } 
            } 
           } 
          }, { 
           "span_multi": { 
            "match": { 
             "regexp": { 
              "message": "doesn't" 
             } 
            } 
           } 
          }], 
          "slop": 0, 
          "collect_payloads": false 
         } 
        }] 
       } 
      } 
     } 
    } 
}} 

Но Эластик не находит его. Без «не» запрос работает.

Я попытался добавить обратную косую черту перед апострофом - «doesn \ t» недействителен, поэтому я сделал «doesn \\ t» и «doesn \\\\ t». Но это не сработает.

Кстати, я создаю запрос с одним словом «не» с обратной косой черты и без

{ 
"_index": "liza_index", 
"_type": ".percolator", 
"_id": "2101", 
"_version": 31, 
"found": true, 
"_source": { 
    "query": { 
     "bool": { 
      "minimum_should_match": 1, 
      "should": { 
       "span_or": { 
        "clauses": [{ 
         "span_multi": { 
          "match": { 
           "regexp": { 
            "message": "doesn't" 
           } 
          } 
         } 
        }] 
       } 
      } 
     } 
    } 
}} 

И это не работает тоже. В то же время следующие запросы работают

curl -XPUT 'localhost:9200/liza_index/.percolator/1' -d '{"query" : {"match" : {"message" : "doesn't"}}}' 

и

curl -XPUT 'localhost:9200/liza_index/.percolator/1' -d '{"query" : {"match" : {"message" : "doesn\\'t"}}}' 

Возникает вопрос: как я могу найти слово с апострофом? Какой запрос я должен создать, используя структуру моего первого запроса?

ответ

0

«Самая трудная вещь из всех, чтобы найти черную кошку в темной комнате, особенно если нет кошки.»

- Конфуций

Elasticsearch выполнять standard analysis and curation данных, которые он получает. Он удаляет большую пунктуацию. Если вы используете запрос , вы передадите свой запрос через тот же процесс curation, и он будет работать (вся пунктуация из запроса будет удалена). Запросы Regexp не рассматриваются. Вот почему он не может найти апостроф.

Вместо создания сложных регулярных выражений запросов можно использовать match_phrase

curl -XPOST "http://esarchive.local:9200/liza_index/.percolator/_search" -d' 
{ 
    "query": { 
    "match_phrase": { 
     "message": "find it is disappointing, but true, that there is no tradition in britain of eating in restaurants, because our food doesn\"t" 
    } 
    } 
}' 

или создать собственный анализатор/картограф, чтобы сохранить puctuation

+1

я найти регулярные выражения, поэтому я не могу используйте match_phrase (насколько я вижу, в match_phrase я не могу использовать регулярные выражения). Таким образом, исправление настроек токенизатора помогает. Спасибо! – Shelari