Как включить два анализатора в один оператор SEARCH? - PullRequest
0 голосов
/ 31 марта 2020

У меня есть коллекция feeds с такими документами:

{
  "created": 1510000000,
  "find": [
    "title of the document",
    "body of the document"
  ],
  "filter": [
    "/example.com",
    "-en"
  ]
}
  • created содержит метку времени эпохи
  • find содержит массив фрагментов полнотекстового текста, например, заголовок и тело текста
  • filter - это массив с дополнительными токенами поиска, такими как хэштеги, домены, локали

Проблема в том, что find содержит полный текст фрагменты, которые мы хотим маркировать, например, с помощью анализатора text, но filter содержит конечные токены, которые мы хотим сравнить в целом, например, с анализатором identity.

Цель состоит в том, чтобы объединить find и filter в один пользовательский анализатор или объединить два анализатора, используя два оператора SEARCH или что-то для этого.

Мне удалось выполнить запрос либо find, либо filter успешно, но не удается запросить обоими. Вот как я делаю запрос по filter:

. Я создал feeds_search представление:

{
  "writebufferIdle": 64,
  "type": "arangosearch",
  "links": {
    "feeds": {
      "analyzers": [
        "identity"
      ],
      "fields": {
        "find": {},
        "filter": {},
        "created": {}
      },
      "includeAllFields": false,
      "storeValues": "none",
      "trackListPositions": false
    }
  },
  "consolidationIntervalMsec": 10000,
  "writebufferActive": 0,
  "primarySort": [],
  "writebufferSizeMax": 33554432,
  "consolidationPolicy": {
    "type": "tier",
    "segmentsBytesFloor": 2097152,
    "segmentsBytesMax": 5368709120,
    "segmentsMax": 10,
    "segmentsMin": 1,
    "minScore": 0
  },
  "cleanupIntervalStep": 2,
  "commitIntervalMsec": 1000,
  "id": "362444",
  "globallyUniqueId": "hD6FBD6EE239C/362444"
}

и создал пример запроса:

FOR feed IN feeds_search
SEARCH ANALYZER(feed.created < 9990000000 AND feed.created > 1500000000 
AND (feed.find == "title of the document")
AND (feed.`filter` == "/example.com" OR feed.`filter` == "-uk"), "identity")
SORT feed.created
LIMIT 20
RETURN feed

. Пример запроса работает, потому что find содержит полный текст (identity анализатор). Как только я переключаюсь на анализатор text, токены с одним словом работают на find, но filter больше не работает.

Я попытался использовать комбинацию SEARCH и FILTER, что дает мне желаемый результат. результат, но я предполагаю, что он, вероятно, работает хуже, чем анализатор SEARCH. Я вижу, что analyzers - это массив в синтаксисе представления, но мне кажется, что я не могу установить отдельные поля для каждого анализатора.

1 Ответ

0 голосов
/ 09 апреля 2020

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

      "analyzers": [
        "identity"
      ],
      "fields": {
        "find": {
          "analyzers": [
            "text_en"
          ]
        },
        "filter": {},
        "created": {}
      },

Кредиты: Simran в ArangoDB

...