0

ニュース ドキュメントをクエリするために、Python Web アプリで Elasticsearch を使用しています。データベースには実際には 100000 のドキュメントがあります。

元のデータベースは mongo であり、elasticsearch は mongoriver プラグインを介してプラグインされます。

問題は、関数が結果を返すのに約 850 ミリ秒かかることです。その数を少しでも減らしたい。

これは、db を照会するために使用している python コードです (制限は通常 16 です)。

def search_news(term, limit, page, flagged_articles):
    query = {

        "query": {
            "from": page*limit,
            "size": limit,
            "multi_match" : {
                "query" : term,
                "fields" : [ "title^3" , "category^5" , "entities.name^5", "art_text^1", "summary^1"]
            }
        },
        "filter" : {
            "not" : {
                "filter" : {
                    "ids" : {
                        "values" : flagged_articles
                    }
                },
                "_cache" : True
            }
        }
    }

    es_query = json_util.dumps(query)

    uri = 'http://localhost:9200/newsidx/_search'
    r = requests.get(uri, data=es_query)

    results = json.loads( r.text )
    data = []
    for res in results['hits']['hits']:
        data.append(res['_source'])

    return data

インデックスのマッピングは次のとおりです。

  {
  "news": {
    "properties": {
      "actual_rank": {
        "type": "long"
      },
      "added": {
        "type": "date",
        "format": "dateOptionalTime"
      },
      "api_id": {
        "type": "long"
      },
      "art_text": {
        "type": "string"
      },
      "category": {
        "type": "string"
      },
      "downvotes": {
        "type": "long"
      },
      "entities": {
        "properties": {
          "etype": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "flags": {
        "properties": {
          "a": {
            "type": "long"
          },
          "b": {
            "type": "long"
          },
          "bad_image": {
            "type": "long"
          },
          "c": {
            "type": "long"
          },
          "d": {
            "type": "long"
          },
          "innapropiate": {
            "type": "long"
          },
          "irrelevant_info": {
            "type": "long"
          },
          "miscategorized": {
            "type": "long"
          }
        }
      },
      "media": {
        "type": "string"
      },
      "published": {
        "type": "string"
      },
      "published_date": {
        "type": "date",
        "format": "dateOptionalTime"
      },
      "show": {
        "type": "boolean"
      },
      "source": {
        "type": "string"
      },
      "source_rank": {
        "type": "double"
      },
      "summary": {
        "type": "string"
      },
      "times_showed": {
        "type": "long"
      },
      "title": {
        "type": "string"
      },
      "top_entities": {
        "properties": {
          "einfo_test": {
            "type": "string"
          },
          "etype": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "tweet_article_poster": {
        "type": "string"
      },
      "tweet_favourites": {
        "type": "long"
      },
      "tweet_retweets": {
        "type": "long"
      },
      "tweet_user_rank": {
        "type": "double"
      },
      "upvotes": {
        "type": "long"
      },
      "url": {
        "type": "string"
      }
    }
  }
}

編集:トルネードサーバー情報の出力を考慮して、サーバーで応答時間を測定しました。

4

2 に答える 2

1

まず第一に、次のようにブーストをマッピングに追加できます (他のクエリに干渉しないと仮定して):

"title": {
  "boost": 3.0,
  "type": "string"
},
"category": {
  "boost": 5.0,
  "type": "string"
},
etc.

次に、次のようなフィールド (またはターム) クエリを使用して bool クエリをセットアップします。

"query": {
  "bool" : {
    "should" : [ {
      "field" : {
        "title" : term
      }
    }, {
      "field" : {
        "category" : term
      }
    } ],
    "must_not" : {
      "ids" : {"values" : flagged_articles}
    }
  }
} 
"from": page * limit,
"size": limit

これはパフォーマンスが向上するはずですが、セットアップにアクセスできないとテストできません:)

于 2013-09-10T10:46:05.477 に答える