Как выполнить поиск по всем полям и вернуть каждый документ, содержащий этот поиск, в elasticsearch?

У меня проблема с поиском в elasticsearch. У меня есть индекс с несколькими документами с несколькими полями. Я хочу иметь возможность выполнять поиск по всем полям, в которых выполняется запрос, и хочу, чтобы он возвращал все документы, содержащие значение, указанное в запросе. Я обнаружил, что использование simple_query_string хорошо для этого подходит. Однако он не возвращает последовательных результатов. В моем индексе есть документы с несколькими полями, содержащими даты. Например:

"revisionDate" : "2008-01-01T00:00:00",
"projectSmirCreationDate" : "2008-07-01T00:00:00",
"changedDate" : "1971-01-01T00:00:00",
"dueDate" : "0001-01-01T00:00:00",

Это всего лишь несколько примеров, однако, когда я индексирую, например:

GET new_document-20_v2/_search
{
  "size": 1000, 
  "query": {
    "simple_query_string" : {
        "query": "2008"
    }
  }
}

Он возвращает только два документа, это проблема, потому что у меня гораздо больше документов, чем два, которые содержат значение 2008 в своих полях.

У меня также есть проблема с поиском имен файлов. В моем индексе есть поля, содержащие имена файлов, например:

"fileName" : "testPDF.pdf",
"fileName" : "demo.pdf",
"fileName" : "demo.txt",

Когда я запрашиваю:

GET new_document-20_v2/_search
{
  "size": 1000, 
  "query": {
    "simple_query_string" : {
        "query": "demo"
    }
  }
}

Я не получаю результатов Но если я запрошу:

GET new_document-20_v2/_search
{
  "size": 1000, 
  "query": {
    "simple_query_string" : {
        "query": "demo.txt"
    }
  }
}

Я получаю нужный результат.

Есть ли лучший способ поиска по всем документам и полям, чем я? Я хочу, чтобы он возвращал весь документ, соответствующий запросу, а не только два или ноль. Любая помощь будет принята с благодарностью.


person Sander Marx    schedule 28.04.2021    source источник
comment
Не могли бы вы поделиться своим отображением индекса?   -  person ESCoder    schedule 28.04.2021
comment
если вы не укажете поле multi_match (и в вашем индексе не задано поле поиска по умолчанию), поиск будет выполняться во всех доступных для поиска полях документы multi_match   -  person Nate    schedule 28.04.2021
comment
@ESCoder сопоставление немного велико, поэтому вот ссылка justpaste.it jpst.it/2uuTT   -  person Sander Marx    schedule 28.04.2021
comment
@Nate Использование multi_match по-прежнему возвращает только два документа при запросе 2008 года.   -  person Sander Marx    schedule 28.04.2021


Ответы (1)


Elasticsearch использует стандартный анализатор, если анализатор не указан. Поскольку для "fileName" не указан анализатор, demo.txt токенизируется до

{
  "tokens": [
    {
      "token": "demo.txt",
      "start_offset": 0,
      "end_offset": 8,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

Теперь, когда вы ищете demo, это не даст никакого результата, но поиск demo.txt даст результат.


Вместо этого вы можете использовать запрос с подстановочными знаками для поиска документа, имеющего demo в fileName

{
  "query": {
    "wildcard": {
      "fileName": {
        "value": "demo*"
      }
    }
  }
}

Результат поиска будет

"hits": [
      {
        "_index": "67303015",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "fileName": "demo.pdf"
        }
      },
      {
        "_index": "67303015",
        "_type": "_doc",
        "_id": "3",
        "_score": 1.0,
        "_source": {
          "fileName": "demo.txt"
        }
      }
    ]

Поскольку revisionDate, projectSmirCreationDate, changedDate, dueDate относятся к типу date, вы не можете выполнять частичный поиск по этим датам.

Вы можете использовать несколько полей, чтобы добавьте еще одно поле (типа text) в вышеуказанные поля. Измените отображение индекса, как показано ниже.

{
  "mappings": {
    "properties": {
      "changedDate": {
        "type": "date",
        "fields": {
          "raw": {
            "type": "text"
          }
        }
      },
      "projectSmirCreationDate": {
        "type": "date",
        "fields": {
          "raw": {
            "type": "text"
          }
        }
      },
      "dueDate": {
        "type": "date",
        "fields": {
          "raw": {
            "type": "text"
          }
        }
      },
      "revisionDate": {
        "type": "date",
        "fields": {
          "raw": {
            "type": "text"
          }
        }
      }
    }
  }
}

Данные индекса:

{
  "revisionDate": "2008-02-01T00:00:00",
  "projectSmirCreationDate": "2008-02-01T00:00:00",
  "changedDate": "1971-01-01T00:00:00",
  "dueDate": "0001-01-01T00:00:00"
}
{
  "revisionDate": "2008-01-01T00:00:00",
  "projectSmirCreationDate": "2008-07-01T00:00:00",
  "changedDate": "1971-01-01T00:00:00",
  "dueDate": "0001-01-01T00:00:00"
}

Поисковый запрос:

{
  "query": {
    "multi_match": {
      "query": "2008"
    }
  }
}

Результат поиска:

"hits": [
      {
        "_index": "67303015",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "revisionDate": "2008-01-01T00:00:00",
          "projectSmirCreationDate": "2008-07-01T00:00:00",
          "changedDate": "1971-01-01T00:00:00",
          "dueDate": "0001-01-01T00:00:00"
        }
      },
      {
        "_index": "67303015",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.18232156,
        "_source": {
          "revisionDate": "2008-02-01T00:00:00",
          "projectSmirCreationDate": "2008-02-01T00:00:00",
          "changedDate": "1971-01-01T00:00:00",
          "dueDate": "0001-01-01T00:00:00"
        }
      }
    ]
person ESCoder    schedule 28.04.2021
comment
@ Сандер Маркс, пожалуйста, просмотрите приведенный выше ответ и дайте мне знать, решит ли это вашу проблему? - person ESCoder; 28.04.2021
comment
@ Сандер Маркс, какие-нибудь обновления здесь? - person ESCoder; 29.04.2021
comment
После изменения моего сопоставления индексов, как вы показали, оно сработало так, как я этого хочу! Большое спасибо! - person Sander Marx; 30.04.2021