Насколько отличается команда поиска в asticsearch-py, если во время индексации я использовал пользовательский токенизацию?

Я использую asticsearch-py для индексирования твитов (изначально в формате JSON). Чтобы сохранить специальные символы, такие как хэштеги, пользовательские цели и смайлики, я указал специальное отображение при создании индекса. Вот как это выглядит:

from elasticsearch import Elasticsearch
import sys,json
es = Elasticsearch()

es.indices.create(
    index='ecommercetweets',
    body={
          "settings" : {
                "index" : {
                    "number_of_shards" : 1,
                    "number_of_replicas" : 1
                },  
                "analysis" : {
                    "filter" : {
                        "tweet_filter" : {
                            "type" : "word_delimiter",
                            "type_table": ["# => ALPHA", "@ => ALPHA", ":) => ALPHA", ":( => ALPHA"]
                        }   
                    },
                    "analyzer" : {
                        "tweet_analyzer" : {
                            "type" : "custom",
                            "tokenizer" : "whitespace",
                            "filter" : ["lowercase", "tweet_filter"]
                        }
                    }
                }
            },
            "mappings" : {
                "tweet" : {
                    "properties" : {
                        "text" : {
                            "analyzer" : "tweet_analyzer"
                        }
                    }
                }
            }
      },
      ignore=400
)

fin = open(sys.argv[1],"r")
count = 0
for line in fin:
    jsonLine = json.loads(line)
    doc = {
        'tweetId' : jsonLine["id"],
        'text' : jsonLine["text"],
        'userId' : jsonLine["user"]["id"],
        'favorite_count' : jsonLine["favorite_count"],
        'retweet_count' :jsonLine["retweet_count"],
        'language': jsonLine["lang"],
        'dateTime':jsonLine["created_at"],
        'location':jsonLine["place"]
    }

    es.index(index='ecommercetweets', doc_type='tweet', id=count, body=doc)
    count+=1

Я ищу с помощью этой команды:

results1 = es.search(index='ecommercetweets',q="text:delivery")
results2 = es.search(index='ecommercetweets',q="text:#delivery")

Оба возвращают одинаковое количество обращений, хотя я уверен, что это не должно относиться к данным, которые я использую.

Я ошибаюсь с командой поиска?

1 ответ

Один из способов справиться с этим - использовать запрос термина (или фильтр термина). Это должно сделать это:

es.search(index='ecommercetweets',body={
   "query": {
      "term": {
         "text": {
            "value": "#delivery"
         }
      }
   }
})

Вот код, который я использовал для игры с ним:

http://sense.qbox.io/gist/fe61f0cd92b465276b261100cbe7f4778002a96d

Другие вопросы по тегам