Выбор правильных анализаторов для Azure Search - PullRequest
0 голосов
/ 10 мая 2018

Мы создали индекс в службе поиска Azure, как показано ниже:

"analyzers": [
{
    "@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
    "name": "SWMLuceneAlongWithCustomHyphenAnalyser",
    "tokenizer": "keyword_v2",
    "tokenFilters": [
        "lowercase"
    ],
    "charFilters": []
}

Этот анализатор назначен свойству под названием «lowerMachineTag».Теперь, когда мы выполняем поиск по следующему запросу, мы получаем ожидаемый результат:

Запрос: search=lowerSystemID:/.*it\'s.*/lowerMachineTag:/.*it\'s.*/&$filter=(systemID%20ne%20null)%20and%20(ownerSalesforceRecordID%20eq%20'a0h5B000000gJKfQAM')&$count=true&$top=100&$skip=0

Результаты:

{
    "@odata.context": "https://abcd/indexes('orders-index')/$metadata#docs",
    "@odata.count": 4,
    "value": [
        {
            "@search.score": 0.1862714,
            "systemID": "*1QXEDL8E2V8MGBY",
            "machineTag": "It's me",
            "systemIDMachineTag": "*1QXEDL8E2V8MGBY|It's me",
            "machineTagSystemID": "It's me|*1QXEDL8E2V8MGBY",
            "lowerMachineTag": "it's me",
            "lowerSystemID": "*1qxedl8e2v8mgby",
            "ownerSalesforceRecordID": "a0h5B000000gJKfQAM",
            "parentSalesforceRecordID": "a0h5B000000gJKfQAM"
        },
        {
            "@search.score": 0.16417237,
            "systemID": "*1QXEDL8E2V8MGBY",
            "machineTag": "It's me",
            "systemIDMachineTag": "*1QXEDL8E2V8MGBY|It's me",
            "machineTagSystemID": "It's me|*1QXEDL8E2V8MGBY",
            "lowerMachineTag": "it's me",
            "lowerSystemID": "*1qxedl8e2v8mgby",
            "ownerSalesforceRecordID": "a0h5B000000gJKfQAM",
            "parentSalesforceRecordID": "a0h5B000000gJKfQAM"
        },
        {
            "@search.score": 0.16417237,
            "systemID": "*1QXEDL8E2V8MGBY",
            "machineTag": "It's me",
            "systemIDMachineTag": "*1QXEDL8E2V8MGBY|It's me",
            "machineTagSystemID": "It's me|*1QXEDL8E2V8MGBY",
            "lowerMachineTag": "it's me",
            "lowerSystemID": "*1qxedl8e2v8mgby",
            "ownerSalesforceRecordID": "a0h5B000000gJKfQAM",
            "parentSalesforceRecordID": "a0h5B000000gJKfQAM"
        },
        {
            "@search.score": 0.16417237,
            "systemID": "*1QXEDL8E2V8MGBY",
            "machineTag": "It's me",
            "systemIDMachineTag": "*1QXEDL8E2V8MGBY|It's me",
            "machineTagSystemID": "It's me|*1QXEDL8E2V8MGBY",
            "lowerMachineTag": "it's me",
            "lowerSystemID": "*1qxedl8e2v8mgby",
            "ownerSalesforceRecordID": "a0h5B000000gJKfQAM",
            "parentSalesforceRecordID": "a0h5B000000gJKfQAM"
        }
    ]
}

Но каковы общие рекомендации для анализатора?конфигурации, если у нас должны быть результаты, возвращаемые, даже когда мы ищем lowerMachineTag: /. it. / в дополнение к описанному выше поведению

1 Ответ

0 голосов
/ 11 мая 2018

Кажется, вы используете регулярное выражение в поисковом запросе - чтобы это работало, вам также необходимо добавить « & queryType = full » в строку запроса.В противном случае весь поисковый термин (« lowerSystemID: /.* it \ 's. * / LowerMachineTag: /.* it \' s. * / ») будет восприниматься как простой запрос, означающий егобудет проанализирован с использованием стандартного анализатора и сопоставлен с любым полем поиска.При добавлении « & queryType = full » ваше регулярное выражение будет пониматься как таковое и сопоставляться только с указанными полями.

По вашему вопросу, если указано « lowerMachineTag: /. It./», оно не будет соответствовать ни одному из четырех документов выше, как «.»в начале регулярное выражение будет пытаться сопоставить символ перед символами «it» и, по крайней мере, в четырех документах выше значение «lowerMachineTag» всегда начинается с «it».

Если вы хотите удалитьначальный "."символ, используя только « lowerMachineTag: / it ./», он все равно не будет совпадать, потому что регулярное выражение должно соответствовать всему токену (хотя добавление «» будет работать: «lowerMachineTag: / it. /»).

Вы можете изменить определение анализатора, чтобы заставить работать «/it./», также используя фильтр токенов nGram_v2 , например, так:

"analyzers": [
{
    "@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
    "name": "SWMLuceneAlongWithCustomHyphenAnalyser",
    "tokenizer": "keyword_v2",
    "tokenFilters": [
        "lowercase", “myNGramTokenFilter”
    ],
    "charFilters": []
},
"tokenFilters":[  
   {  
      "name":"myNGramTokenFilter",  
      "@odata.type":"Microsoft.Azure.Search.NGramTokenFilterV2",  
      "minGram":1,  
      "maxGram":100
   }  
]

Это все равно сделаетВаш исходный запрос (+ "queryType = full") возвращает те же результаты, а также возвращает результаты при использовании "lowerMachineTag: / it ./".

Надеюсь, это поможет!

...