Поиск слов и фраз по нескольким полям в ElasticSearch - PullRequest
2 голосов
/ 25 марта 2020

Я бы хотел искать документы, используя Python через ElasticSearch. Я ищу документы, которые содержат слово и / или фразу в любом из трех полей.

GET /my_docs/_search
{
  "query": {
    "multi_match": {
      "query": "Ford \"lone star\"",
      "fields": [
        "title",
        "description",
        "news_content"
      ],
      "minimum_should_match": "-1",
      "operator": "AND"
    }
  }
}

В приведенном выше запросе я хотел бы получить документы, заголовок, описание или news_content которых содержат "Ford" и "lone star" (как фраза).

Однако Кажется, что «одинокая звезда» не воспринимается как фраза. Возвращает документы с надписью "Ford", "lone" и "star".

1 Ответ

1 голос
/ 25 марта 2020

Итак, я смог воспроизвести вашу проблему и решил ее, используя REST API Elasticsearch, так как я не знаком с синтаксисом python и рад, что вы предоставили свой поисковый запрос в формате JSON, и я создал свое решение поверх него.

Индекс def

{
    "mappings": {
        "properties": {
            "title": {
                "type": "text"
            },
            "description" :{
                "type" : "text"
            },
            "news_content" : {
                "type" : "text"
            }
        }
    }
}

Образцы документов

{
  "title" : "Ford",
  "news_content" : "lone star", --> note this matches your criteria
  "description" : "foo bar"
}

{
  "title" : "Ford",
  "news_content" : "lone",
  "description" : "star"
}

Поисковый запрос, который вы ищете

{
    "query": {
        "bool": {
            "must": [ --> note this, both clause must match
                {
                    "multi_match": {
                        "query": "ford",
                        "fields": [
                            "title",
                            "description",
                            "news_content"
                        ]
                    }
                },
                {
                    "multi_match": {
                        "query": "lone star",
                        "fields": [
                            "title",
                            "description",
                            "news_content"
                        ],
                        "type": "phrase" --> note `lone star` must be phrase
                    }
                }
            ]
        }
    }
}

Результат содержит только один сделать c из образца

"hits": [
      {
        "_index": "so_phrase",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.9527341,
        "_source": {
          "title": "Ford",
          "news_content": "lone star",
          "description": "foo bar"
        }
      }
    ]
...