Как получить Azure Результаты поиска, которые содержат хотя бы одно полное слово? - PullRequest
0 голосов
/ 21 января 2020

Я тестирую следующий запрос в Azure Поисковый портал, но не дает ожидаемых результатов. В результате я хочу, чтобы любой документ имел хотя бы одно вхождение algo word.

search = al go & queryType = full & searchMode = any

Важно: MyVal - Доступно для поиска и имеется Lucene Analyzer (spani sh)

Ожидаемый результат элемента:

{
    "@odata.context": "https://....windows.net/indexes(....)/$metadata#docs(*)",
    "value": [
        {
            "MyKey":"1",
            "MyValues":[
                {
                    "MyVal":"algo aqui"
                },
                {
                    "MyVal":"lala"
                },
            ]
        }
    ]
}

НЕ ожидаемый результат элемента:

{
    "@odata.context": "https://....windows.net/indexes(....)/$metadata#docs(*)",
    "value": [
        {
            "MyKey":"1",
            "MyValues":[
                {
                    "MyVal":"algoOtherStuff aqui"
                },
                {
                    "MyVal":"lala"
                },
            ]
        }
    ]
}

Полученный результат:

{
    "@odata.context": "https://....windows.net/indexes(....)/$metadata#docs(*)",
    "value": []
}

Дополнительные примеры запросов и результатов

search = al go* & queryType = full & searchMode = any

[Нет результатов]


search = /. al go . / & QueryType = full & searchMode = any

[Нет результатов]


search = al go aqui & queryType = full & searchMode = any

[ОЖИДАЕМЫЙ РЕЗУЛЬТАТ !!!] (найден элемент)


search = aqui & queryType = full & searchMode = any

[ОЖИДАЕМЫЙ РЕЗУЛЬТАТ !!!] (найден элемент)


ВАЖНО: Если я изменю слова для двух других, чтобы проверить, как: «некоторые данные» или «что-то особенное» и поиск по одному из них, Azure Поиск возвращает ожидаемые результаты. Похоже, проблема с "al go" конкретным словом.

1 Ответ

2 голосов
/ 23 января 2020

Хорошо, я смог воспроизвести проблему с помощью следующего кода:

var client = new SearchServiceClient("xxxx", new SearchCredentials("abcabc"));

            client.Indexes.Create(new Microsoft.Azure.Search.Models.Index
            {
                Name = "index",
                Fields = new List<Field>
                {
                    new Field("Id", DataType.String){ IsKey = true, IsRetrievable = true, IsFilterable = true},
                    Field.NewComplex("MyValues", true, new List<Field> { new Field("MyVal", DataType.String)
                        {
                            IsRetrievable = true,
                            IsFilterable = true,
                            IsSearchable =true,
                            Analyzer = AnalyzerName.EsLucene
                        }
                    })
                }
            });

            var docs = new List<CustomDoc> {
                new CustomDoc { Id = "1", MyValues = new MyValues[] { new MyValues { MyVal = "algo aqui" }, new MyValues { MyVal = "lala" }} },
                new CustomDoc { Id = "2", MyValues = new MyValues[] { new MyValues { MyVal = "something else" }, new MyValues { MyVal = "xxx" }} },
            };

            var indexClient = client.Indexes.GetClient("index");
            indexClient.Documents.Index(IndexBatch.Upload(docs));

И да, вы были правы. «Al go» считается стоп-словом в анализаторе StandardLucene (испанский sh):

https://github.com/apache/lucene-solr/blob/master/lucene/analysis/common/src/resources/org/apache/lucene/analysis/snowball/spanish_stop.txt

При переходе на анализатор EsMicrosoft возвращается поиск "al go":

client.Indexes.Create(new Microsoft.Azure.Search.Models.Index
            {
                Name = "index",
                Fields = new List<Field>
                {
                    new Field("Id", DataType.String){ IsKey = true, IsRetrievable = true, IsFilterable = true},
                    Field.NewComplex("MyValues", true, new List<Field> { new Field("MyVal", DataType.String)
                        {
                            IsRetrievable = true,
                            IsFilterable = true,
                            IsSearchable =true,
                            Analyzer = AnalyzerName.EsMicrosoft
                        }
                    })
                }
            });
...