2015-07-15 5 views
2

Я запустил веб-сайт для фотографии. Фотографы ставят свою «by_line» как «Some name/ourwebsite.com».Экранирование косой черты в elasticsearch

У меня есть DSL, который я использую для большинства своих запросов, строя вместе «фильтрующие» запросы, используя «термины», которые отлично подходят для 90% случаев, однако в этом случае я получаю нулевые результаты с помощью запрос, как это (обратите внимание, как я пытался избежать слэш):

body: 
    {query: 
    {filtered: 
     {filter: 
     {and: 
      [{term: {is_visible: true}}, 
      {term: {"event.by_line": "john\\/my_website.com"}}] 
     } 
     } 
    } 
    } 

Я использую elasticsearch версии 1.5.2

Когда я смотрю на отображениях по этому адресу

http://127.0.0.1:9200/development_photos/_mapping?pretty=1 

это пример запись

{ 
    "_index" : "development_photos", 
    "_type" : "photo", 
    "_id" : "251", 
    "_score" : 1.0, 
    "_source":{"id":251, 
      "name":"LET'S PANIC ISSUE 02 LAUNCH DINNER", 
      "image":"BFA_85_251.jpg", 
      "position":null, 
      "event_id":85, 
      "created_at":"2015-06-21T22:27:21.000Z", 
      "is_visible":true, 
      "img":{"thumb":"thumb.png"} 
      ,"ppl":[{"id":429,"position":20,"person_name":"John Kealy","person_slug":"john-kealy","person_id":30}], 
      "keywords":[], 
      "event":{"id":85, 
         "state":"New York", 
         "time_created":"8:00 PM", 
         "date_created":"20150611", 
         "city":"New York", 
         "caption":"Let's Panic-mosphere", 
         "by_line":"John Kealy/BFA.com", 
         "name":"LET'S PANIC ISSUE 02 LAUNCH DINNER", 
         "zip_processing":null 
        } 
      } 
} 

и отображение

{ 
    "development_photos" : { 
    "mappings" : { 
     "photo" : { 
     "properties" : { 
      "created_at" : { 
      "type" : "date", 
      "format" : "dateOptionalTime" 
      }, 
      "event" : { 
      "properties" : { 
       "abstract" : { 
       "type" : "string" 
       }, 
       "author" : { 
       "type" : "string" 
       }, 
       "by_line" : { 
       "type" : "string" 
       }, 
       "caption" : { 
       "type" : "string" 
       }, 
       "city" : { 
       "type" : "string" 
       }, 
       "copyright_notice" : { 
       "type" : "string" 
       }, 
       "country_primary_location_name" : { 
       "type" : "string" 
       }, 
       "cover_photo_id" : { 
       "type" : "long" 
       }, 
       "created_at" : { 
       "type" : "date", 
       "format" : "dateOptionalTime" 
       }, 
       "date_created" : { 
       "type" : "string" 
       }, 
       "folder" : { 
       "type" : "string" 
       }, 
       "id" : { 
       "type" : "long" 
       }, 
       "is_private" : { 
       "type" : "boolean" 
       }, 
       "make_public_on" : { 
       "type" : "string" 
       }, 
       "name" : { 
       "type" : "string" 
       }, 
       "password" : { 
       "type" : "string" 
       }, 
       "position" : { 
       "type" : "long" 
       }, 
       "pr_usage" : { 
       "type" : "boolean" 
       }, 
       "province" : { 
       "type" : "string" 
       }, 
       "purchases_disabled" : { 
       "type" : "boolean" 
       }, 
       "state" : { 
       "type" : "string" 
       }, 
       "sub_location" : { 
       "type" : "string" 
       }, 
       "time_created" : { 
       "type" : "string" 
       }, 
       "updated_at" : { 
       "type" : "date", 
       "format" : "dateOptionalTime" 
       }, 
       "uploader_id" : { 
       "type" : "long" 
       }, 
       "view_only_password" : { 
       "type" : "string" 
       } 
      } 
      }, 
      "event_id" : { 
      "type" : "long" 
      }, 
      "id" : { 
      "type" : "long" 
      }, 
      "image" : { 
      "type" : "string" 
      }, 
      "img" : { 
      "properties" : { 
       "preview" : { 
       "type" : "string" 
       }, 
       "thumb" : { 
       "type" : "string" 
       }, 
       "thumb_rollover" : { 
       "type" : "string" 
       } 
      } 
      }, 
      "is_visible" : { 
      "type" : "boolean" 
      }, 
      "keywords" : { 
      "properties" : { 
       "id" : { 
       "type" : "long" 
       }, 
       "name" : { 
       "type" : "string" 
       }, 
       "tag_id" : { 
       "type" : "long" 
       } 
      } 
      }, 
      "name" : { 
      "type" : "string" 
      }, 
      "position" : { 
      "type" : "long" 
      }, 
      "ppl" : { 
      "properties" : { 
       "id" : { 
       "type" : "long" 
       }, 
       "person_id" : { 
       "type" : "long" 
       }, 
       "person_name" : { 
       "type" : "string" 
       }, 
       "person_slug" : { 
       "type" : "string" 
       }, 
       "position" : { 
       "type" : "long" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Согласно предложению bittusarkar, я обновил свой запрос использовать fquery. Теперь у меня еще два вопроса. Как я могу связать запросы fquery?

Это приведет к упругой неудаче поиска

{filtered: 
    {filter: 
    {and: 
     [{term:{is_visible:true}}, 
     {term:{is_private:false}}], 
    fquery: 
     {query: 
     {match: 
      {by_line:"Kealy/BFAnyc", 
      sub_location:"can i chain these queries"}}}}}} 

Это приводит к ошибке «запрос разобранной в упрощенном виде, с прямым именем поля, но включал больше возможностей, чем просто имя поля, возможно, использовать его форма 'options', с элементом 'query'?

Кроме того, когда я пытаюсь смешивать fquery с моим старым способом просто привязки «и» фильтров, он возвращает результаты, которые он не должен .. Похоже, что он игнорирует «и» запросы. Например:

{filtered: 
    {filter: 
    {and: 
     [{term: {is_visible:true}}, 
     {term: {is_private: false}}, 
     {term: {sub_location: "can"}}, 
     {term: {sub_location: "i"}}, 
     {term: {sub_location: "chain"}}, 
     {term: {sub_location: "these"}}, 
     {term: {sub_location: "queries"}}], 
    fquery: 
     {query: 
     {match: 
      {by_line:JohnKealy/BFAnyc"}}}}}} 

отчеты, как это придумали в результатах поиска: (обратите внимание, как «sub_location не соответствует моему sub_location запрос)

{event: {"id":1, 
    "sub_location":"New York", 
    "state":nil, 
    "author":nil, 
    "copyright_notice":nil, 
    "country_primary_location_name":nil, 
    "time_created":nil, 
    "date_created":nil, 
    "city":nil, 
    "caption":nil, 
    "by_line":"JohnKealy/BFAnyc", 
    "abstract":nil, 
    "name":"John Kealy", 
    "province":nil, 
    "folder":"foo", 
    "password":nil, 
    "visible":nil, 
    "zip_created_at":nil, 
    "zip_processing":nil, 
    "position":0, 
    "pdf":nil, 
    "cover_photo_id":nil, 
    "created_at":"2015-07-16T15:53:26.000Z", 
    "updated_at":"2015-07-16T15:53:26.000Z", 
    "is_private":false, 
    "price_mod":nil, 
    "uploader_id":nil, 
    "view_only_password":nil, 
    "pr_usage":nil, 
    "purchases_disabled":nil, 
    "make_public_on":nil}} 
+1

Вопрос заключается в том, что у вас в ваш индекс? Вы указали эту косую черту? Какой анализатор вы использовали во время индексирования для поля 'by_line'? –

+0

Андрей прав, как обычно. Индексированные данные будут зависеть от токенизатора/TokenFilters, используемых в вашем анализаторе. Пожалуйста, проверьте ваше сопоставление (или опубликуйте его) для получения дополнительной помощи. –

ответ

3

От вашего картографирования это выглядит как вы используете анализатор по умолчанию для поля by_line. Это означает, что значение «John Kealy/BFA.com» индексируется как следующие термины отдельно - «john», «kealy», «bfa» и «com». Теперь term запрос работает для не анализируемые поля. Он ищет полный термин «John Kealy/BFA.com», который, конечно же, отсутствует в инвертированном индексе. Вам нужно использовать match запрос вместо term запрос здесь, как показано ниже:

{ 
    "query": { 
     "match": { 
     "by_line": "John Kealy/BFA.com" 
     } 
    } 
} 

Если вы хотите, чтобы это было частью фильтра, вы можете использовать fquery, как показано ниже:

{ 
    "filter": { 
     "fquery": { 
     "query": { 
      "match": { 
       "by_line": "John Kealy/BFA.com" 
      } 
     }, 
     "_cache": true 
     } 
    } 
} 
+0

удивительный, который полностью работает! – jdkealy

+0

, но подождите .... это прерывает мои другие запросы фильтра. обновляя мой вопрос. – jdkealy

+0

Я создал новый вопрос http://stackoverflow.com/questions/31524191/is-it-possible-to-chain-fquery-filters-in-elastic-search – jdkealy

Смежные вопросы