Sé que mongo no admite $regex o una operación similar con búsqueda de texto completo en este momento. Solo coincide con el texto o la frase. Pero necesito realizar una búsqueda de consulta similar en campos indexados. Por lo tanto, necesito ayuda con respecto a la elección de múltiples marcos de búsqueda o cualquier otro trabajo para resolver este problema.
He anidado la estructura del documento. Por ejemplo:
{ "name": "John", "phones": [{ "phone_number": "1234", "is_primary": true }, { "phone_number": "5678", "is_primary": false }] }Intenté usar Apache Solr pero descubrí que no brinda un buen soporte para documentos anidados. Aplana la estructura e indexa los campos, pero cuando traté de realizar una consulta similar a la que mencioné anteriormente, no funcionó.
Estoy usando scala, play y mongodb . No es factible para mí cambiar la estructura del documento anidado ahora. ¿Cuáles son las plataformas de búsqueda adecuadas que podría integrar con mongodb para desarrollar un marco de búsqueda poderoso? ¿Cómo puedo manejar este problema? ¿Cuál sería el mejor enfoque en este escenario?
Para realizar una búsqueda de texto completo, puede crear text index y usarlo. más sobre el índice de texto
Sintaxis para crear índice de texto
db.colectionName.createIndex( { fieldName: "text" } );Aquí se muestra para un solo campo que también puede crear con múltiples campos. pero recuerda que
Una colección puede tener como máximo un índice de texto.
entonces puedes buscar usando $text y $search
var searchText= 'some text to search'; db.collectionName.find({ $text: { $search: searchText} }); Pero para la coincidencia de secuencias o la coincidencia de patrones no es necesario crear text index puede usar $regex .
var searchName ='som'; db.collectionName.find({"name":{ $regex: searchName, $options: 'i' }}) para la consulta anterior con $regex que coincidirá parcialmente. por ejemplo, en su name:'some text to search' por lo que puede devolver datos si el valor de searchName como some , som , ome , rex ...
para un mejor rendimiento puede crear un índice normal para el campo de name
Puede hacer esto en SOLR, pero debe definir de antemano los tipos de consultas que desea realizar y aplanar el índice de manera creativa para que pueda consultar y recuperar lo que necesita. Puede utilizar campos de varios valores para almacenar más de un valor. Puede almacenar una versión JSON de todo el objeto en un campo de texto si su cliente necesita crear una instancia.
Por ejemplo, podría almacenar primarias y secundarias por separado:
phone_number_primary: 1234,... phone_number_secondary: 5678,... my_json_blob: {OBJECT HERE}luego puede recuperar y consultar cada uno por separado. Si desea buscar ambos, puede consultar ambos
( phone_number_primary:1234 OR phone_number_secondary:1234)o puede definir un campo adicional que almacene ambos números en su esquema:
<copyField source="phone_number_*" dest="phone_number_all" />y luego busque en este campo.