Подстановочный запрос - массив с косой чертой в запросе - PullRequest
0 голосов
/ 11 октября 2019

В моих документах, проиндексированных эластичным поиском, у меня есть поле с именем IPC8s.IPC8, представляющее собой массив строк, которые могут выглядеть следующим образом:

["B63H011/00"]
["B60F3", "B60K1", "B60K17", "B60K17/23", "B60K6", "B60K6"]
["G06F017/00"]
etc...

(для любого любопытного это классификация патентов CPCцифры)

Мне нужно запросить это поле с конечными подстановочными знаками. Другими словами, если я введу «B63H», документ, содержащий «B63H011 / 00», должен совпадать. То же самое, если я введу «B63H011 /» или «B63H011 / 0».

Я пробовал несколько запросов, ни один из которых не работал:

{
  query_string: {
    default_field: "IPC8s.IPC8",
    query: "(B63H*) OR (B63H011/*)",
    analyze_wildcard: true
  }
}

Я пробовал этот также с \"B63H*\" OR \"B63H011/*\", не работает.

Тогда я попробовал:

[{
  wildcard: {
    "IPC8s.IPC8": { value: "B63H*" }
  }
},
{
  wildcard: {
    "IPC8s.IPC8": { value: "B63H011/*" }
  }
}]

Это тоже не работает. Затем я попытался убежать от «/», потому что его нужно понимать буквально. Не сработало.

Что я делаю не так? Спасибо.

Редактировать : Вот сопоставление для этого конкретного поля:

"IPC8s": {
  "properties": {
    "IPC8": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    }
  }
}

Вот моя последняя попытка, которая все еще не сработала (если я небез косой черты ,asticsearch возвращает ошибку):

{
  query_string: {
    default_field: "IPC8s.IPC8",
    query: "(B63H*) OR (B63H011\\/*)",
    analyze_wildcard: true,
    analyzer: "keyword"
  }
}

Редактировать 2 : Это похоже на уловку:

    {
      query_string: {
        default_field: "IPC8s.IPC8.keyword",
        query: "(B63H*) OR (B63H011\\/*)",
        analyze_wildcard: true,
        analyzer: "keyword"
      }
    }

1 Ответ

1 голос
/ 11 октября 2019

Тип текста со стандартным анализатором создаст следующий токен, следовательно, вы не сможете выполнить поиск по /

{
  "tokens" : [
    {
      "token" : "b63h011",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "00",
      "start_offset" : 8,
      "end_offset" : 10,
      "type" : "<NUM>",
      "position" : 1
    }
  ]
}

Создайте подполе для IPC8 с ключевым словом типа, в котором будет храниться текст

.
GET index21/_search
{
  "query": {
    "wildcard": {
      "IPC8s.IPC8.keyword": {
        "value": "B63H011/*"
      }
    }
  }
}`
...