MongoDB выполняет логический ИЛИ поиск терминов, если не указано как фраза. Таким образом, поиск по «быстрой коричневой собаке» вернет только те документы, в текстовой указатель которых включена запись, содержащая фразу «быстрая коричневая собака», тогда как при поиске по «быстрой» коричневой «собаке» вернуть документы, в которых есть хотя бы одно из этих слов.

я очень смущен этим поведением. Это кажется непоследовательным и странным, особенно с учетом того, что я читал, что Mongo не должен поддерживать частичные условия поиска в полнотекстовом поиске. Я использую версию 3.4.7 Mongo DB Community Server. Я делаю эти тесты из оболочки Монго.

Итак, у меня есть коллекция БД Mongo с назначенным текстовым индексом. Я создал индекс следующим образом:

db.submissions.createIndex({"$**":"text"})

В этой коллекции есть документ, который содержит эти два значения:

"Craig"

"Доктор Боб".

Моя цель - выполнить текстовый поиск документа, в котором есть несколько совпадающих терминов.

Итак, вот тесты, которые я провел, и их противоречивый вывод:

ОДИН СРОК, ПОЛНЫЙ

db.submissions.find({"$text":{"$search":"\"Craig\""}})

Результат: получает документ с этим значением.

ОДИН СРОК, ЧАСТИЧНЫЙ

db.submissions.find({"$text":{"$search":"\"Crai\""}})

Результат: ничего не возвращает, потому что этот частичный поисковый термин не совсем совпадает с чем-либо в документе.

НЕСКОЛЬКО УСЛОВИЙ

db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bob\""}})

Результат: возвращает документ с обоими этими терминами.

НЕСКОЛЬКО УСЛОВИЙ, ОДИН ЧАСТИЧНЫЙ

db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}})

Результат: возвращает документ с обоими терминами, несмотря на то, что один термин является частичным. В документе нет ничего, что соответствовало бы доктору Бо

НЕСКОЛЬКО УСЛОВИЙ, ОБА ЧАСТИЧНЫХ

db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}})

Результат: возвращает документ с обоими терминами, несмотря на то, что оба термина являются частичными и неполными. В документе нет ничего, что соответствовало бы ни «Крей», ни «Доктор Бо».

Вопрос

Итак, все сводится к: почему? Почему, когда я делаю текстовый поиск с частичным термином только с одним значением, ничего не возвращается. Когда я делаю текстовый поиск с двумя частичными терминами, я получаю соответствующий результат? Это кажется странным и непоследовательным.

Благодарю.

 Ankit Kumar18 сент. 2017 г., 23:37
Я сталкиваюсь с той же проблемой,Проверьте здесь

Ответы на вопрос(1)

Решение Вопроса

$text поиски не поддерживают частичное соответствие. позволяет выполнять запросы текстового поиска по строковому содержимому с поддержкой нечувствительности к регистру, разделителей, стоп-слов и основ. А термины в поисковой строке по умолчанию имеют ИЛИ.

Взять ваши (очень полезные :) примеры один за другим:

ОДИН СРОК, ЧАСТИЧНЫЙ

// returns nothing because there is no world word with the value `Crai` in your
// text index and there is no whole word for which `Crai` is a recognised stem
db.submissions.find({"$text":{"$search":"\"Crai\""}})

НЕСКОЛЬКО УСЛОВИЙ

// returns the document because it contains all of these words
// note in the text index Dr. Bob is not a single entry since "." is a delimiter
db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bob\""}})

НЕСКОЛЬКО УСЛОВИЙ, ОДИН ЧАСТИЧНЫЙ

// returns the document because it contains the whole word "Craig" and it 
// contains the whole word "Dr" 
db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}})

НЕСКОЛЬКО УСЛОВИЙ, ОБА ЧАСТИЧНЫХ

// returns the document because it contains the whole word "Dr"
db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}})

Имейте в виду, что$search Строка это ...

Строка терминов, которые анализирует и использует для запроса текстового индекса. выполняет логическийИЛИ ЖЕ поиск терминов, если не указано как фраза.

Итак, если хотя бы один термин в вашем$search строка соответствует, тогда соответствует этому документу.

Чтобы проверить это поведение, если вы редактируете документ, изменяяDr. Bob вDrBob тогда следующие запросы вернутсянет документы:

db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}})
db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}})

Теперь они не возвращают совпадений, потому чтоDr больше не является целым словом в вашем текстовом индексе, потому что за ним не следует. разделитель.

 user222305919 сент. 2017 г., 15:43
Вау, большое спасибо за очень тщательный ответ. У меня есть последний вопрос о поиске текста. Есть ли способ сделать это на 100% включительно по всем условиям. Проведя дополнительное тестирование, я заметил, что если один из терминов совпадает с документом, он захватит весь документ. Есть ли способ сделать текстовый поиск, чтобы все термины соответствовали?
 glytching19 сент. 2017 г., 15:46
MongoDB выполняет логический ИЛИ поиск терминов, если не указано как фраза. Таким образом, поиск по «быстрой коричневой собаке» вернет только те документы, в текстовой указатель которых включена запись, содержащая фразу «быстрая коричневая собака», тогда как при поиске по «быстрой» коричневой «собаке» вернуть документы, в которых есть хотя бы одно из этих слов.

Ваш ответ на вопрос