Как мне сделать запрос Elastic Search, учитывая мое сопоставление и использование ключевых слов? - PullRequest
6 голосов
/ 20 июля 2011

У меня очень простое отображение, которое выглядит следующим образом (я немного упростил пример):

{
    "location" : {
        "properties": {
            "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
            "description": { "type": "string", "analyzer": "snowball" }
        }
    }
}

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

Я бы хотел иметь возможность искать местоположения, которые соответствуют любому из заданных ключевых слов либо в имени, либо в поле описания. (имя важнее, поэтому я дал ему повышение). Я пробовал несколько разных запросов, и они не дают никаких результатов.

{
    "fields" : ["name", "description"],
    "query" : {
        "terms" : {
            "name" : ["savage"],
            "description" : ["savage"]
        },
        "from" : 0,
        "size" : 500
    }
}

Учитывая, что есть места, в описании которых есть слово savaged , это должно дать мне некоторые результаты ( savage - основа savaged ). Это дает 0 результатов, используя вышеуказанный запрос. Я использовал curl для запроса ES:

curl -XGET -d @query.json http://localhost:9200/myindex/locations/_search

Если вместо этого я использую строку запроса:

curl -XGET http://localhost:9200/fieldtripfinder/locations/_search?q=description:savage

Я на самом деле получаю один результат (конечно, теперь он будет искать только в поле описания).

В основном я ищу запрос, который будет выполнять ИЛИ-поиск по нескольким ключевым словам и сравнивать их со значениями как в поле имени, так и в поле описания.

1 Ответ

6 голосов
/ 20 июля 2011

Снежок превращает «дикарь» в «дикарь», поэтому термин «дикарь» не дал никаких результатов.Однако, когда вы указываете «дикарь» в URL, он анализируется, и вы получаете результаты.В зависимости от ваших намерений, вы можете использовать правильный ствол («savag») или проанализировать свои термины, используя запрос «match» вместо «терминов»:

{
  "fields" : ["name", "description"],
  "query" : {
    "bool" : {
      "should" : [
        {"match" : {"name" : "savage"}},
        {"match" : {"description" : "savage"}}
      ]
    },
    "from" : 0,
    "size" : 500
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...