Поиск по Azure - пара значений ключа фильтра, соединенная двойными трубами - PullRequest
0 голосов
/ 13 июня 2018

У меня есть поле EDM.string, которое я использую для хранения пар ключ-значение, разделенных '||'и запятые.Например:

{
    "CustomField": "1234|||student, 5678||blue, 999||metallica, etc..."
}

Мне нужно выполнить запрос для извлечения комбинации ключ-значение.Например:

search=5678 blue&searchFields=CustomField&searchMode=all&queryType=full

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

search=/5678.*blue/&queryType=full&searchMode=all

Я использую анализатор по умолчанию, поэтому кажется, что он игнорирует '||».Я пытался использовать регулярные выражения, но безуспешно.Можно ли выполнить запрос по паре ключ-значение, не сохраняя ее в EDM.Collection (строка)?Я хотел бы избежать нового процесса переиндексации.Заранее спасибо.

Обновление

Использование коллекций и нового набора данных:

{
    "@odata.context": "https://[service].search.windows.net/indexes('[index]')/$metadata#docs",
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.45867884,
            "uniqueid": "5",
            "Name": null,
            "Kvp": [
                "1234||sepultura",
                "999||programmer",
                "876||no education"
            ],
            "Kvp2": "1234||sepultura, 999 programmer, 876||no education"
        },
        {
            "@search.score": 0.38223237,
            "uniqueid": "1",
            "Name": null,
            "Kvp": [
                "1234||metallica",
                "999||horse education",
                "876||high school"
            ],
            "Kvp2": "1234||metallica, 999 horse education, 876||high school"
        },
        {
            "@search.score": 0.38223237,
            "uniqueid": "3",
            "Name": null,
            "Kvp": [
                "1234||john mayer",
                "999||kid education",
                "876||university"
            ],
            "Kvp2": "1234||john mayer, 999 kid education, 876||university"
        }
    ]
}

Мой поисковый запрос выглядит так:

Kvp: education&$count=true&queryType=full&searchMode=all

Проблема в том, что я хотел бы избежать получения uniqueid 5.Хотя в качестве значения одного из тегов указано «образование», это не ключ 999.

Также пробовал:

Kvp: 999||education&$count=true&queryType=full&searchMode=all

Kvp: /.*999.*/ AND /.*education.*/&$count=true&queryType=full&searchMode=all

Kvp: /999.*education/&$count=true&queryType=full&searchMode=all

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Используйте поиск фразы , заключив в кавычки ваш запрос: Kvp:"999||education"

Анализатор действительно удаляет |символ, так что это фактически эквивалентно Kvp:"999 education".Важно понять, как работает анализ.То, что вы индексируете здесь, когда вы индексируете: «1234 ||| студент, 5678 || синий, 999 || metallica», это шесть терминов:

  • 1234
  • студент
  • 5678
  • синий
  • 999
  • metallica

Запрос and не работает, так как он ищет совпадения в любом местев этом списке, в поле, таким образом, совпадая с идентификатором 5. Порядок или смежность не рассматриваются, как если бы они были для запроса фразы.

Запрос регулярного выражения не работает, поскольку он должен соответствовать всему в пределах одного термина,Kvp:999.*education не будет работать, потому что "999" и "образование" анализируются в отдельных терминах, поэтому нет отдельных терминов , которые соответствуют этому регулярному выражению.


Другой вариант,кстати, было бы поменять анализатор.Например, если вы используете анализатор пробелов, он изменит индексированные термины на:

  • 1234 || студент,
  • 5678 || синий,
  • 999|| metallica,

Это могло бы быть решением для вас, но лишило бы возможности эффективно искать просто "metallica".

0 голосов
/ 13 июня 2018

Я не верю, что Regex был бы наиболее эффективным способом сделать это, так как мы действительно не будем выполнять полнотекстовый поиск в вашем случае.Если вы хотите получить комбинации ключ / значение, имеет ли смысл поместить все различные ключи / значения в доступную для поиска коллекцию?Таким образом, вы можете легко найти «5678 || blue».Хотя, если вы пошли по этому пути, вам действительно не нужны трубы (||).

...