2015-11-24 83 views
2

這可能太過SO的問題的基礎,但我想我會問無論如何。如何模仿URI查詢

我用ElasticSearch弄溼了自己的腳,並試圖返回一個與我感興趣的領域完全匹配的文檔。

我有被映射爲類型「字符串」索引爲「not_analyzed」字段「StoryText」。

當我搜索使用基本URI查詢:

123.456.0.789:9200/stories/storyphrases/_search?q=StoryText:"The boy sat quietly" 

我返回準確匹配的文檔如我所料單一擊中。

然而,當我使用搜索功能:

GET 123.456.0.789:9200/stories/storyphrases/_search 

{ 
"query" : { 
    "filtered" : { 
     "filter" : { 
      "term" : { 
       "StoryText" : "The boy sat quietly" 
      } 
     } 
    } 
} 

}

我得到多個文檔,許多命中(即「小男孩大聲地坐下」,「男孩靜靜地站在」等返回等)

有人可以幫助我瞭解我需要重組我的搜索請求以模仿我使用基本查詢參數的結果嗎?

目前我使用的窩在C#中生成它看起來像這樣

var searchresults = client.Search<stories>(p => p 
    .Query(q => q 
     .Filtered(r => r 
      .Filter(s => s.Term("StoryText", inputtext)) 
      ) 
     ) 
    ); 

非常感謝任何及所有讀取和或想法我的搜索請求!


UPDATE:映射下面列出

GET /stories/storyphrases/_mappings 

{ 
"stories": { 
    "mappings": { 
     "storyphrases": { 
      "dynamic": "strict", 
      "properties": { 
       "@timestamp": { 
        "type": "date", 
        "format": "date_optional_time" 
       }, 
       "@version": { 
        "type": "string" 
       }, 
       "SubjectCode": { 
        "type": "string" 
       }, 
       "VerbCode": { 
        "type": "string" 
       }, 
       "LocationCode": { 
        "type": "string" 
       }, 
       "BookCode": { 
        "type": "string" 
       }, 
       "Route": { 
        "type": "string" 
       }, 
       "StoryText": { 
        "type": "string", 
        "index": "not_analyzed" 
       }, 
       "SourceType": { 
        "type": "string" 
       }, 
       "host": { 
        "type": "string" 
       }, 
       "message": { 
        "type": "string" 
       }, 
       "path": { 
        "type": "string" 
       } 
      } 
     } 
    } 
} 

米克

+0

你的'StoryText'字段絕對沒有被分析?你能發佈你的映射嗎? – ceej

回答

1

嗯,首先你在這裏執行兩個不同的查詢。第一個在查詢上下文中運行,而第二個基本上是在過濾的上下文中執行的一個match_all查詢。如果你的目標是簡單地模仿第一查詢,但通過傳遞一個JSON身體,你會需要像

GET 123.456.0.789:9200/stories/storyphrases/_search 
{ 
    "query" : { 
     "query_string" : { 
      "query" : "StoryText:'The boy sat quietly'" 
     } 
    } 
} 

要使用巢編寫這個簡單的查詢,你會用

var searchresults = client.Search<stories>(p => p.QueryString("StoryText:" + inputtext)); 

或更長的形式

var searchresults = client.Search<stories>(p => p 
    .Query(q => q 
     .QueryString(qs => qs 
      .Query("StoryText:" + inputtext) 
      ) 
     ) 
    ); 

這兩個產生相同的JSON體並將其發送到_search端點。假設storyphrases是您的Elasticsearch類型,那麼您可能還希望將它包含在C#中。

var searchresults = client.Search<stories>(p => p 
    .Index("stories") 
    .Type("storyphrases") 
    .Query(q => q 
     .QueryString(qs => qs 
      .Query("StoryText:" + inputtext) 
      ) 
     ) 
    ); 

說了這麼多,看着你的過濾查詢它應該做的,你根據我的測試中會發生什麼。你的領域絕對沒有被分析?你能發佈你的映射嗎?

+0

我更新了我的帖子以顯示我的映射,並對我的回覆中的延遲表示歉意。我會嘗試你的建議,並回復答案。 – IrishMickeyWard

+0

映射看起來不錯。您是否嘗試過使用_indices_ API來查看輸入文本的分析方式?使用捲曲:'curl -XGET「http://123.456.0.789:9200/stories/_analyze?field=StoryText」-d'這個男孩安靜地坐着'' – ceej

+0

嗨Ceej ....對不起,我的回覆中的延遲。我嘗試了你的建議,並得到了以下回復:{「_index」:「stories」,_type「:」storyphrases「,」_id「:」_analyze「,」found「:false}'。 ,但是我仍然在我的代碼中返回多個匹配單個詞組,我感到困惑。 – IrishMickeyWard