2014-02-28 4 views
0

저는 최근에 Solr로부터 전환 한 것처럼 elasticsearch의 새 관찰자입니다. 나는 이제 내 solrconfig의 edismax 쿼리를 elasticsearch와 함께 작동하도록 변환하려고 시도 중이다.dis-max-query와 관련하여 minimum_should_match

는 기본적으로 나는 용어가 한 번에 두 필드에 검색 할 할, 그래서이 쿼리에 결국 : 이것은 하나의 용어와 함께 잘 작동

{ 
    "query": { 
    "dis_max": { 
     "queries": [ 
     { 
      "match": { 
      "field_1": { 
       "query": "term1" 
      } 
      } 
     }, 
     { 
      "match": { 
      "field_2": { 
       "query": "term1" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

. 여러 용어가있는 경우 각 용어를 찾을 필요는 없습니다. 그러나이 기능을 구현할 방법을 찾지 못했습니다. 이것이 minimum_should_match 매개 변수에 대한 것이고 bool query에 의해 제공됩니다.

세 가지 용어가 있는데 두 가지 이상을 찾아야합니다. 시행 착오를 통해 내가 이런 일을 포함 변종의 많은 선택 :

{ 
    "query": { 
    "dis_max": { 
     "queries": [ 
     { 
      "match": { 
      "field_1": { 
       "query": "term1 term2 nonexistingterm", 
       "operator": "and", 
       "minimum_should_match": 2 
      } 
      } 
     }, 
     { 
      "match": { 
      "field_2": { 
       "query": "term1 term2 nonexistingterm", 
       "operator": "and", 
       "minimum_should_match": 2 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

그러나 minimum_should_match 여기서 일하지 않습니다, 인해 and 운영자에게 어떤 결과를 찾을 수 없습니다. or과 함께 작동하지 않습니다. 결과를 반환하는 데는 하나의 조회만으로 충분하지 않습니다.

누군가 dis_maxminimum should match을 결합 할 수 있습니까?

나는 이것에 대한 문서를 찾을 수 없으므로 elasticsearch에서 이러한 정보를 찾을 수있는 힌트를 얻으실 수 있습니다.

+0

나는 이미'또는'로 시도한 것이 무슨 뜻인지 잘 모르겠습니다. 아래 쿼리는 테스트에서 올바르게 작동하는 것 같습니다. 작동하지 않는 경우 설정에 대한 세부 정보가 필요할 수 있습니다. – femtoRgon

+0

이 내 설정은 다음과 같습니다 "버전": { "수": "1.0.0", "build_hash": "a46900e9c72c0a623d71b54016357d5f94c8ea32" "build_timestamp": "2014-02-12T16 : 18 : 34Z" " "build_snapshot": false, "lucene_version": "4.6" , – linqu

답변

1

operator: and을 사용하고 있으며 minimum_should_match을 제공하고 있는데 이는 완전히 이해가되지 않습니다. 이 operator: and로,이 같은 쿼리 생산하는 것 :

field1:term1 AND field1:term2 AND field1:nonexistingterm 
그래서

모두에 관계없이 당신의 minimum_should_match로 설정되어 무엇 요구된다. 최소 동작을 효과적으로 사용하려면 "or"연산자와 함께 should 절을 생성해야합니다. 이는 "or"가 기본값이기 때문에 operator 설정을 제거하는 것만 큼 간단하므로 찾고자하는 동작을보아야합니다. 즉 :

{ 
    "query": { 
    "dis_max": { 
     "queries": [ 
     { 
      "match": { 
      "field_1": { 
       "query": "term1 term2 nonexistingterm", 
       "minimum_should_match": 2 
      } 
      } 
     }, 
     { 
      "match": { 
      "field_2": { 
       "query": "term1 term2 nonexistingterm", 
       "minimum_should_match": 2 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

안녕하세요 @femtoRgon, 저는 '과'는별로 의미가 없지만 구성을 포함하여 모든 것을 시도했습니다. 하지만 그것은 작동하지 않습니다 : 당신이 "쿼리"를 넣으면 : "term1 nonexterm1 nonexterm2"쿼리는 여전히 결과를 반환 – linqu

+0

물론, 그래서 우리는 여기에 몇 가지 정보가 누락되었습니다. 아마도 귀하의 분석기는 예상치 못한 일을하고있을 것입니다. [explain] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-explain.html)의 결과는 왜 특정한 결과를 얻었는지 이해하는 데 매우 도움이 될 수 있습니다. 이 문제를 더 잘 이해하기 위해 좀 더 간단한 쿼리를 시도해 볼 수도 있습니다. match_quest 중 하나만 시도해보십시오. dis_max를 래핑하지 않고 무슨 일이 일어나는 지보십시오. 개별적으로 용어 하나 하나를 검색해보고해야한다고 생각하지 않는 곳에서 조회수가 발생하는지 확인하십시오. – femtoRgon

+0

설명문을 지적 해 주셔서 감사 드리며 마지막으로 쿼리를 단계별로 시작하는 것이 좋습니다.이 문제는 쿼리 자체와 관련이 없지만 네게 그램을 사용하는 잘못 사용 된 분석기와 관련이 있습니다. 당신의 도움을 주셔서 감사합니다! – linqu