Je souhaite rechercher des documents dans MarkLogic.MarkLogic - Recherche par filtre Max/Min
Mes documents ressemblent:
<product xmlns="myns/products">
<id>3114</id>
<materialNo xml:lang="en">1.1160</materialNo>
<steelName xml:lang="en">SWRCH24K</steelName>
<name xml:lang="en">wire, wire rod for cold heading</name>
<chemicalProperties>
<chemicalProperty>
<element>c</element>
<min>0.1900</min>
<max>0.2500</max>
</chemicalProperty>
<chemicalProperty>
<element>si</element>
<min>0.1000</min>
<max>0.3500</max>
</chemicalProperty>
<chemicalProperty>
<element>mn</element>
<min>1.3500</min>
<max>1.6500</max>
</chemicalProperty>
<chemicalProperty>
<element>p</element>
<max>0.0300</max>
</chemicalProperty>
</chemicalProperties>
</product>
donc je veux effectuer une recherche via des valeurs max/min des propriétés chimiques. Pour ce faire j'utiliser cette recherche XQuery (exemple simple):
cts:search(/, cts:and-query(
(cts:collection-query("test"),
cts:element-value-query(
fn:QName("myns/products", "name"),
"wire, wire rod for cold heading"),
cts:element-query(
fn:QName("myns/products", "chemicalProperty"),
cts:and-query(
(cts:element-value-query(
fn:QName("myns/products", "element"), "c"),
cts:or-query(
(cts:element-range-query(
fn:QName("myns/products", "max"), "<=", 0.2),
cts:and-not-query(
cts:element-range-query(
fn:QName("myns/products", "min"), "<=", 0.2),
cts:element-value-query(
fn:QName("myns/products", "max"), "*")))),
cts:or-query(
(cts:element-range-query(
fn:QName("myns/products", "min"), ">=", 0.1),
cts:and-not-query(
cts:element-range-query(
fn:QName("myns/products", "max"), ">=", 0.1),
cts:element-value-query(
fn:QName("myns/products", "min"), "*"))))))))))
Le problème est que la requête ci-dessus renvoie le document de l'échantillon. Les sous-requêtes (et -non) sont là pour vérifier si max/min existe. Dans certains cas, il peut y avoir seulement une valeur minimale ou maximale.
Mais ce document est hors limites ?!
Ma base de données possède des index de plage d'éléments sur min et max. Tous les autres paramètres sont par défaut.
Quel est le problème? Aucune suggestion.
MISE À JOUR
Ok, merci pour les suggestions mais non. La validation de la position de la valeur ne résout pas le problème. Cependant, une solution consiste à supprimer le « et non-requête » et le remplacer par un « et demande » et d'ajouter de nouveaux attributs aux documents:
<chemicalProperty hasMin="0" hasMax="1">...
l'indexation et l'interrogation de ces attributs fonctionne et renvoie le bon résultats.
Si vous avez une question de suivi, veuillez l'afficher en tant que question SO distincte. Si cette question est pertinente, vous pouvez la lier dans la nouvelle. – wst