2017-01-15 2 views
1

Ich habe ein Problem mit elasticsearch. Es gibt ein Item ("'title': 'Python mit Elasticsearch' verwenden") im Index. Ich kann das zurückgegebene Ergebnis nur erhalten, ich suche die genaue Abfrage. Wenn ich jedoch den "'title': 'Python with'" suche, kann der Code nichts treffen.
Die es-Version ist: {u'cluster_name ': u'elasticsearch', u'tagline ': du weißt, für die Suche', u'version ': {u'lucene_version': u'5.4.1 ', u'build_hash ': u'd045fc29d1932bce18b2e65ab8b297fbf6cd41a1', u'number ': u'2.2.1', u'build_timestamp ': u'2016-03-09T09: 38: 54Z', u'build_snapshot ': Falsch}, u' Name ': u'Lorelei Travis'}
Wenn ich richtig bin, sollte es 2.2.1 sein. Der Code ist angehängt. Also, wie bekomme ich den Treffer, wenn ich mit der Abfrage wie "Python mit verwenden" suche, ohne eine exakte Match-Abfrage. Vielen Dank!Wie bekomme ich einen Treffer ohne genaue Übereinstimmung mit es 2.X? (Python elasticsearch)

INDEX_NAME = 'test_11' 
from elasticsearch import Elasticsearch 
es = Elasticsearch() 
print es.info() 

request_body = { 
     "mappings":{ 
     "post":{ 
      "properties":{ 
      "title":{ 
       "type":"string", 
       "index":"analyzed" 
      } 
      } 
     } 
     } 
    } 

if es.indices.exists(INDEX_NAME): 
    res = es.indices.delete(index = INDEX_NAME) 
    print(" response: '%s'" % (res)) 

res = es.indices.create(index = INDEX_NAME, body=request_body) 
print res 

es.index(index=INDEX_NAME, doc_type='post', id=1, body={ 
    'title': 'Using Python with Elasticsearch' 
    } 
) 

es.indices.refresh(index=INDEX_NAME) 

res = es.search(index=INDEX_NAME, body={'query': {'match': {'title': 'Using Python with Elasticsearch'}}}) 
#res = es.search(index=INDEX_NAME, body ={"query":{"match":{"title":"Using Python with"}}}) 

print '\n' 
res = es.indices.get(index=INDEX_NAME) 
print res 

Antwort

0

Verwenden Sie eine prefix Abfrage? Wenn Sie etwas schicker wollen, betrachten Sie regexp Abfrage oder fuzzy Abfrage.

EDIT: Korrigieren Sie mich, wenn ich falsch liege: Sie möchten Using Python with, um alle Ergebnisse wie Using Python with Elasticsearch, Using Python with Lucene? Dann wird eine Abbildung wie:

request_body = { 
    "mappings":{ 
    "post":{ 
     "properties":{ 
     "title":{ 
      "type":"string", 
      "index":"not_analyzed" 
     } 
     } 
    } 
    } 
} 

und dann eine Abfrage wie:

{ 
    "query": { 
     "prefix": { 
      "title": "Using Python with" 
     } 
    } 
} 

Sollten alle relevanten Dokumente zurück. Hinweis Ich habe das Feld index in not_analyzed geändert.

Mehr here.

BEARBEITEN 2: Wenn Sie alle Dokumente abgleichen möchten, die die exakte Abfrage an einer beliebigen Stelle im Zielfeld enthalten, und nicht nur als Präfix, verwenden Sie zunächst eine Abfrage wie oben vorgeschlagen: regexp. Dann

{ 
    "query": { 
     "wildcard": { 
      "name": "Using Python with*" 
     } 
    } 
} 

wird wie ein Präfix Abfrage arbeiten und sowohl Using Python with Elasticsearch als Using Python with Lucene auch passen, aber

{ 
    "query": { 
     "wildcard": { 
      "name": "*Python with Elasticsearch" 
     } 
    } 
} 

wird Using Python with Elasticsearch nur entsprechen. Es passt nicht Using Python with elasticsearch aber Sie sagten, Sie wollten genaue Phrase übereinstimmen.

+0

Ich weiß, Fuzzy-Abfrage kann diese Funktion erreichen. Aber ich möchte Volltextsuche erreichen. Vielen Dank ! – chocolate9624

+0

Ich habe meine Antwort bearbeitet, um ein Beispiel zu geben. – rtkaleta

+0

Danke! Es klappt! Aber ich möchte Volltextsuche erreichen. Mit der Abfrage "Python with Elasticsearch" kann es nichts treffen. – chocolate9624

Verwandte Themen