Mam pole z tokenizerem, który dzieli kropki. W wyszukiwaniu poniższa wartość aaa.bbb zostanie podzielona na dwa terminy aaa i bbb.

Moje pytanie brzmi, jak pisać zapytanie Bool, które będą zawierać wiele warunków w tym samym terminie?

Na przykład, chcę uzyskać wszystkie dokumenty, w których jego pole zawiera termin, który pasuje do rozmytych wyszukiwania gmail, ale także ten sam termin nie może zawierać gamil.

Oto kilka przykładów tego, co chcę osiągnąć:

  • bmail // Dopasuj: Od czasu jego dopasowania rozmyte wyszukiwanie i nie jest gamil
  • gamil.bmail // Match: Od czasu terminu bmail Mecze rozmyte wyszukiwanie i nie jest gamil
  • gamil // Nie Dopasuj: Od czasu jego dopasowania rozmyte wyszukiwanie i ale równe gamil


Uwaga: Poniższe zapytanie nie wydaje się działać, ponieważ wygląda tak, jakby jeden termin pasuje do jednego stanu, a druga kadencja pasuje do drugiego, będzie on uznany za trafienie.

{
  ...
  "body": {
    "query": {
      "bool": {
        "must": [
          {
            "fuzzy": {
              "my_field": {
                "value": "gmail",
                "fuzziness": 1,
                "max_expansions": 2100000000
              }
            }
          },
          {
            "bool": {
              "must_not": [
                {
                  "query_string": {
                    "default_field": "my_field",
                    "query": "*gamil*",
                    "analyzer": "keyword"
                  }
                }
              ]
            }
          }
        ]
      }
    }
  },
}
1
D.C 17 luty 2021, 10:49

1 odpowiedź

Najlepsza odpowiedź

Skończyło się za pomocą Highlight przez wykonanie rozmyty (lub Każde inne) zapytanie, a następnie programowo filtruj wyniki przez zwrócony obiekt podświetlenia.

Pytania może być również dobrą opcją Jeśli nie potrzebujesz wyrażenia regularnego lub możesz upewnić się, że nie przekraczasz limitu zapytań boolowskich. (Zobacz więcej szczegółów na podanym linku)

0
D.C 8 marzec 2021, 06:24