Meine Lösung Abenteuer
Ich habe meinen Fall begann, wie Sie in meiner Frage sehen können. Immer wenn ich einen Teil meiner Einstellungen geändert habe, hat ein Teil angefangen zu arbeiten, aber ein anderer Teil hört auf zu arbeiten. Lassen Sie mich meine Lösungshistorie geben:
1.) Ich habe meine Daten als Standard indiziert. Das bedeutet, dass meine Daten standardmäßig analyzed
sind. Dies wird Probleme auf meiner Seite verursachen. Beispielsweise;
Wenn Benutzer ein Schlüsselwort wie SVF-1, System ausführen, um diese Abfrage zu suchen begann:
{
"query": {
"filtered" : {
"query" : {
"query_string" : {
"analyze_wildcard": true,
"query": "*SVF-1*"
}
}
}
}
}
und Ergebnisse;
SVF-123
SVF-234
Das ist normal, weil name
Bereich meiner Dokumente analyzed
sind. Dies teilt die Abfrage in Tokens SVF
und 1
, und SVF
entspricht meinen Dokumenten, obwohl 1
nicht übereinstimmt. Ich habe diesen Weg ausgelassen.Ich habe eine Zuordnung erstellen für meine Felder sie machen not_analyzed
{
"mappings":{
"product":{
"properties":{
"name":{
"type":"string",
"index": "not_analyzed"
},
"site":{
"type":"string",
"index": "not_analyzed"
}
}
}
}
}
aber mein Problem fortgesetzt.
2.) Ich wollte nach viel Forschung einen anderen Weg versuchen. Beschlossen, wildcard query zu verwenden. Meine Abfrage ist;
{
"query": {
"wildcard" : {
"name" : {
"value" : *SVF-1*"
}
}
},
"filter":{
"term": {"site":"pro_en_GB"}
}
}
}
Diese Abfrage funktionierte, aber ein Problem hier. Meine Felder werden nicht mehr analysiert, und ich mache eine Platzhalterabfrage. Groß-/Kleinschreibung ist hier ein Problem. Wenn ich wie svf-1 suche, gibt es nichts zurück. Da kann Benutzer Kleinbuchstaben Version der Abfrage eingeben.
3.) Ich habe meine Dokumentstruktur geändert;
{
"mappings":{
"product":{
"properties":{
"name":{
"type":"string",
"index": "not_analyzed"
},
"nameLowerCase":{
"type":"string",
"index": "not_analyzed"
}
"site":{
"type":"string",
"index": "not_analyzed"
}
}
}
}
}
Ich habe ein weiteres Feld adde für name
nameLowerCase
genannt. Wenn ich mein Dokument indexiere, setze ich mein Dokument wie;
{
name: "SVF-123",
nameLowerCase: "svf-123",
site: "pro_en_GB"
}
Hier, ich bin Umwandlung Abfrage Schlüsselwort in Kleinbuchstaben und Suchoperation auf neue nameLowerCase
Index zu machen. Und Anzeige name
Feld.
Endgültige Version meiner Abfrage ist;
{
"query": {
"wildcard" : {
"nameLowerCase" : {
"value" : "*svf-1*"
}
}
},
"filter":{
"term": {"site":"pro_en_GB"}
}
}
}
Jetzt funktioniert es. Es gibt auch eine Möglichkeit, dieses Problem zu lösen, indem Sie multi_field verwenden. Meine Abfrage enthält Bindestrich (-) und einige Probleme.
Vielen Dank an @ Alex Brasetvik für seine ausführliche Erklärung und Mühe
FYI, die Sie nicht wirklich eine führende Wildcard wollen, ich denke, es bei jedem doc aussehen wird, wenn Sie das tun. – mconlin
Ich kenne den Defekt auf der Leistung, aber ich muss Wildcard-Suche sogar SVF- * –
Ich denke Trailing Wildcards ist in Ordnung, Sie wollen einfach nicht die führende .. – mconlin