MongoDB Regex игнорирует тире внутри имени - PullRequest
0 голосов
/ 13 января 2020

я хочу найти Place.Name по поисковым словам eq: "saint germain"

я использую go .mongodb.org / mon go -драйвер / mon go

Место сбора выглядит так:

type (
    Place struct {
        ID      primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
        Name    string             `json:"name,omitempty" bson:"name"`
        ...
    }
)

Имена баз данных похожи:

"Saint-Germain-l'Auxerrois, Paris",
"Halles, Paris",
"Palais-Royal, Paris",
"Place-Vendôme, Paris",
"Gaillon, Paris",
"Vivienne, Paris",
"Mail, Paris",
"Bonne-Nouvelle, Paris",
"Arts-et-Métiers, Paris",
"Enfants-Rouges, Paris",
"Archives, Paris",

My mongodb Req :

query := "saint germain" 
XXX.Collection("places").Find(context.Background(), bson.M{"name": primitive.Regex{Pattern: ".*" + query + ".*", Options: "i"}})

Требуются результаты

"Saint-Germain-l'Auxerrois, Paris",

Я бы хотел игнорировать «тире», как настроить «регулярное выражение», чтобы он мог найти «Сен-Жермен-л'Оксерруа» , Париж "с запросом" Сен-Жермен "

1 Ответ

0 голосов
/ 20 января 2020

Я бы хотел игнорировать «тире», как настроить «регулярное выражение», чтобы он мог найти «Сен-Жермен-л'Аксерруа, Париж» с запросом «Сен-Жермен»

Вместо поиска с использованием Regex , я бы рекомендовал использовать MongoDB Text Search для выполнения операций запроса, которые выполняют текстовый поиск строкового содержимого.

Сначала необходимо создать текстовый индекс для коллекции. Обратите внимание, что коллекция может иметь только один индекс текстового поиска, но индекс может охватывать несколько полей. Например:

db.places.createIndex({"name": "text"})

В своем коде Go вы можете сделать:

collection := client.Database("databaseName").Collection("places")
query := bson.M{"$text": bson.M{"$search": "saint germain"}}
cursor, err := collection.Find(context.Background(), query)

В качестве альтернативы, если ваш кластер находится в MongoDB Atlas и вы ищите детализированную текстовую индексацию для расширенной функциональности поиска, см. MongoDB Atlas: Полнотекстовый поиск .

Полнотекстовый поиск позволяет пользователям использовать возможности Apache Lucene для текстового поиска. Например:

collection := client.Database("databaseName").Collection("places")
location := "saint germain"
pipeline := mongo.Pipeline{
        {{"$searchBeta", bson.D{
                {"search", bson.D{
                    {"query", location},
                    {"path", "name"}},
                }},
        }},
}
cursor, err := collection.Aggregate(context.Background(), pipeline)

Приведенные выше фрагменты кода будут возвращать аналогичные результаты name: "Saint-Germain-l'Auxerrois, Paris". Фрагменты были написаны с использованием mon go - go -driver v1.2.x с MongoDB v4.2.x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...