2016-09-08 9 views
0

文字列の住所を検索する効率的なクエリを作成するにはどうすればよいですか?たとえば、ユーザーの生体は「私たちは123 Main Stにあります」と言い、「123 Main St」という文字列は一致する必要があります。私が必要とするパターンは、1つまたは複数の数字(たとえば[0-9] +)、その後に続く1-4語(ただし、0ではありません) 「South Fifth」や「Martin Luther King Jr」)、「Street」や「Avenue」のような単語で終わります。解析された文字列内の米国の住所を見つけるための弾性検索クエリ

ここではなく、働く私が作成した予備的なクエリは非常にゆっくりと走るのです:

{ 
    "_source": false, 
    "from": 0, 
    "size": 10, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "span_near": { 
      "clauses": [ 
       { 
       "span_multi": { 
        "match": { 
        "regexp": { 
         "details.bio": "[0-9]+" 
        } 
        } 
       } 
       }, 
       { 
       "span_multi": { 
        "match": { 
        "regexp": { 
         "details.bio": "[a-zA-Z0-9]+" 
        } 
        } 
       } 
       }, 
       { 
       "span_multi": { 
        "match": { 
        "regexp": { 
         "details.bio": "St|st|street|Street|ave|Ave|AVE|Avenue|avenue|blvd|BLVD|Blvd|boulevard|Boulevard|drive|Drive|dr|DR|Dr|lane|Lane|Ln|ln|Road|road|Rd|rd" 
        } 
        } 
       } 
       } 
      ], 
      "slop": 0, 
      "in_order": true 
      } 
     } 
     ] 
    } 
    } 
} 

非常に高価であるこのクエリの一部が第二の正規表現である「[-ZA-Z0-9] + "。私が試した最初の選択肢は、これを削除して4の「スロップ」を追加することでしたが、スロープが0の場合は誤検出率が高すぎます(たとえば、バイオと「21ストリートスマート」と一致します)。したがって、ワイルドカードを使用せずに、最初の式(ストリート番号)と2番目の式(St、Blvdなど)の間に、1から4ワードの距離を必要とする必要がありますが、0ではありません。助言がありますか?

答えて

0

解決済み!私は "span_not"検索を利用しました。 slop = 4までのすべてを含めてから、slop = 0を除外します。約2秒対1m +で実行されます。

{ 
    "span_not": { 
     "include": { 
      "span_near": { 
       "clauses": [ 
        { 
         "span_multi": { 
          "match": { 
           "regexp": { 
            "details.bio": "[0-9]+" 
           } 
          } 
         } 
        }, 
        { 
         "span_multi": { 
          "match": { 
           "regexp": { 
            "details.bio": "St|st|street|Street|ave|Ave|AVE|Avenue|avenue|blvd|BLVD|Blvd|boulevard|Boulevard|drive|Drive|dr|DR|Dr|lane|Lane|Ln|ln|Road|road|Rd|rd" 
           } 
          } 
         } 
        } 
       ], 
       "slop": 4, 
       "in_order": true 
      } 
     }, 
     "exclude": { 
      "span_near": { 
       "clauses": [ 
        { 
         "span_multi": { 
          "match": { 
           "regexp": { 
            "details.bio": "[0-9]+" 
           } 
          } 
         } 

       }, 
       { 
        "span_multi": { 
         "match": { 
          "regexp": { 
           "details.bio": "St|st|street|Street|ave|Ave|AVE|Avenue|avenue|blvd|BLVD|Blvd|boulevard|Boulevard|drive|Drive|dr|DR|Dr|lane|Lane|Ln|ln|Road|road|Rd|rd" 
          } 
         } 
        } 
       } 
      ], 
      "slop": 0, 
      "in_order": true 
     } 
    } 
} 

}

関連する問題