Нужна помощь в написании запроса Flexiblesearch, который должен искать на основе текста одного поля и другого поля массива с (переданные значения или ноль) - PullRequest
0 голосов
/ 28 мая 2019

У меня есть данные в базе данных mysql, которые были сохранены в эластичном поиске как документы, использующие задание logstash.

**Data example in database:**

firstname(text), lastname(text), email(text), tags(text & nullable)

Здесь теги получают значение согласно этому в mysql: "t1, t2, t3" или""

При добавлении данных вasticsearch пользовательский анализатор / токенизатор был применен с использованием ", (запятая)".

Мне нужны данные согласно этому и нужно написать запрос для этого:

firstname = "text", tags = ["t1","t2"]

"Get all records which contain this firstname and tags with either "t1 or t2 or (t1 & t2) or null" (any in which tags are empty)".

Я пробовал несколько запросов, чтобы получить такой результат, но ничего не получалось.(Он не возвращает записи с нулевыми тегами, а также с тегами (t1, t2))

GET /posts/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "some_text",
                  "fields": [
                    "firstname^1.0"
                  ]
                }
              },
              {
                "bool": {
                  "should": [
                    {
                      "terms": {
                        "tags": [
                          "t2"
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "some_text",
                  "fields": [
                    "firstname^1.0"
                  ]
                }
              },
              {
                "bool": {
                  "should": [
                    {
                      "terms": {
                        "tags": [
                          ""
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}
GET /posts/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "some_text",
                  "fields": [
                    "firstname^1.0"
                  ]
                }
              },
              {
                "bool": {
                  "should": [
                    {
                      "terms": {
                        "tags": [
                          "t2"
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "some_text",
                  "fields": [
                    "firstname^1.0"
                  ]
                }
              },
              {
                "bool": {
                   "must_not": {
                      "exists": {
                          "field": "tags"
                       }
                    }                
                 }
              }
            ]
          }
        }
      ]
    }
  }
}

1 Ответ

1 голос
/ 29 мая 2019

Поместите пустую проверку (nust_not -> exists) внутри предложения must вместе с запросом terms для tags.

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "some_text",
            "fields": [
              "firstname^1.0"
            ]
          }
        }
      ],
      "should": [
        {
          "terms": {
            "tags": [
              "t1",
              "t2",
              ""
            ]
          }
        },
        {
          "bool": {
            "must_not": {
              "exists": {
                "field": "tags"
              }
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

ИЛИ

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "some_text",
            "fields": [
              "firstname^1.0"
            ]
          }
        },
        {
          "bool": {
            "should": [
              {
                "terms": {
                  "tags": [
                    "t1",
                    "t2",
                    ""
                  ]
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "tags"
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}
...