una tamaño saber matriz matrices llenar leer insertar imprimir ejemplo datos arreglo c# arrays elasticsearch

tamaño - Necesita saber cómo buscar en ES utilizando la búsqueda de c#en matrices



matrices en c# (1)

Hola, soy un novato en ElasticSearch y necesito ayuda. Estoy trabajando con c # (pensé que podría usar un QueryRaw en String, creo ...). Debajo del escenario:

Datos

{ "id": "1", "title": "Small cars", "tagsColours": ["grey", "black", "white"], "tagsCars": ["Suzuki", "Ford"], "tagsKeywords": [] }, { "id": "2", "title": "Medium cars", "tagsColours": [], "tagsCars": ["VW", "Audi", "Peugeot"], "tagsKeywords": ["Sedan"] }, { "id": "3", "title": "Big cars", "tagsColours": ["red", "black"], "tagsCars": ["Jeep", "Dodge"], "tagsKeywords": ["Van", "Big"] }

Objetivo

Me gustaría aplicar filtros en las columnas de etiquetas en función de la selección de los usuarios. los valores se llenarán en las columnas de matriz de etiquetasXXX con valores seleccionados.

  • si el valor del conjunto de parámetros no está vacío, el resultado debe contener al menos una instancia. Lo mismo para cada conjunto de parámetros. cuantos más parámetros tengan valores, más búsqueda específica se debe hacer
  • si al menos hay un valor que proviene del parámetro que coincide entre todos los valores en la matriz de columnas de etiquetas de cualquier documento, obtenga ese documento. pero si hay otro valor en otra matriz de etiquetasXXX, entonces debería tenerlo en cuenta.
  • si el conjunto de parámetros de etiqueta no tiene valores, entonces ignore ese filtro

Respuestas deseadas

A) Si el usuario selecciona solo 1 etiqueta Color (es decir, negro) como se muestra a continuación:

{ id: "", title: "", tagsColours: ["black"], tagsCars: [], tagsKeywords: [] }

Me gustaría obtener documentos con Id = 2 y id = 3, ya que tienen negro en sus etiquetasColores y no tienen en cuenta las etiquetasCarros y etiquetasKeywords, ya que no hay valores en los parámetros

B) Si el usuario selecciona solo 2 etiquetas diff (es decir, = color = negro y cars = audi, y mercedez benz) como se describe a continuación:

{ id: "", title: "", tagsColours: ["black", "yellow"], tagsCars: ["Audi", "Mercedes Benz"], tagsKeywords: [] }

Me gustaría obtener documentos con id = 2 ya que encontró negro en tagsColours y encontró Audi en tagsCars, Y no debería extraer el documento id = 1 porque incluso cuando el negro está en tagsColours, ninguno de los valores de parámetros (audi, mercedez benz ) está en sus tagsCars values

Hola a todos, tengo problemas al intentar buscar en ElasticSearch y buscar en matrices con valores, y cuando los parámetros no tienen valores. Si alguien pudiera ayudarme en esto, apreciaría. Hice esto:

termsQuery = Query<StructuredData>.Terms(t => t.Field(f =>f.TagsColours).Terms(dataToSearch.TagsColours)); termsQuery = termsQuery && Query<StructuredData>.Terms(t => t.Field(f =>f.TagsCars).Terms(dataToSearch.TagsCars));

y me detuve aquí (no agregué el tercer filtro) porque no pude mezclar dos filtros juntos dataToSearch tiene los valores de los parámetros (mismo objeto de estructura, causa .Buscar me hace hacer eso aquí .Búsqueda ()

var settings = new ConnectionSettings(node); var response = new ElasticClient(settings) .Search<StructuredData>( s => s.AllIndices() .AllTypes() .From(0) .Size(50) .Query(_ => termsQuery) );

Pero estoy teniendo problemas cuando uso más de 1 filtro ... ¿Alguna idea? es ".Terms" la propiedad correcta?


Si está utilizando asignaciones regulares en ES 5> Esto le dará los resultados que desee. Si no, deberás cambiar la asignación.

QueryContainer query = null; if(dataToSearch.TagsColours != null && dataToSearch.TagsCars.Length > 0) { query = Query<StructuredData>.Terms(t=>t.Field("tagsColours.keyword").Terms(dataToSearch.TagsColours)); } if(dataToSearch.TagsColours != null && dataToSearch.TagsCars.Length > 0) { var q = Query<StructuredData>.Terms(t=>t.Field("tagsCars.keyword").Terms(dataToSearch.TagsCars)); query = query == null ? q : query && q; } if(dataToSearch.TagsKeywords != null && dataToSearch.TagsKeywords.Length > 0) { var q = Query<StructuredData>.Terms(t=>t.Field("tagsKeywords.keyword").Terms(dataToSearch.TagsKeywords)); query = query == null ? q : query && q; }

El problema que tiene es que el término consulta se realiza en un valor no analizado y los campos de texto predeterminados utilizan el analizador estándar. A partir de 5 agregaron un campo secundario de palabras clave que usa el analizador de palabras clave, básicamente coloca los términos tal como están y puede hacer una búsqueda por valores sin formato. El analizador estándar dosis de tokenización para palabras y minúsculas todos los términos por lo que no pudo encontrar Audi porque el término era audi. Si solo quiere minúsculas en la cadena de entrada, esto no resolverá el problema de Mercedes Benz ya que en los términos estándar esto se convertirá en términos benz dos términos en lugar de uno en otras palabras los términos devolverán resultados si pones mercedes o benz pero no mercedes Benz. Si desea realizar una búsqueda que no distinga entre mayúsculas y minúsculas con la consulta de coincidencia, deberá agregar un analizador personalizado.